- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
static int func_name (const uint8_t * address)
{
int result;
asm ("movl $1f, %0; movzbl %1, %0; 1:"
: "=&a" (result) : "m" (*address));
return result;
}
我已经通过 Internet 浏览了内联汇编引用资料。但是我无法弄清楚这段代码在做什么,例如。 $1f 是什么?“m”是什么意思?正常的内联约定不是使用“=r”和“r”吗?
最佳答案
该代码在功能上与 return *address
相同,但不完全等同于此 wrt。到生成的二进制/目标文件。
在 ELF 中,使用前向引用(即 mov $1f, ...
来检索程序集本地标签的地址)导致创建所谓的搬迁。重定位是对链接器的指令(在可执行文件创建时或稍后在可执行文件/库加载时对动态链接器)插入仅在链接/加载时已知的值.在目标代码中,这看起来像:
Disassembly of section .text:0000000000000000 : 0: b8 00 00 00 00 mov $0x0,%eax 5: 0f b6 07 movzbl (%rdi),%eax 8: c3 retq
请注意此处的值(在 .text
部分的偏移量 1 处)为零,尽管这实际上是不正确的 - 这取决于函数将在运行代码中结束的位置。只有(动态)链接器最终才能知道这一点,而这 block 内存在加载时需要更新的信息实际上是放在目标文件中的:
$ readelf -a xqf.oELF Header:[ ... ]Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 0000000000000000 00000040 0000000000000009 0000000000000000 AX 0 0 16 [ 2] .rela.text RELA 0000000000000000 000004e0 0000000000000018 0000000000000018 10 1 8[ ... ]Relocation section '.rela.text' at offset 0x4e0 contains 1 entries: Offset Info Type Sym. Value Sym. Name + Addend000000000001 00020000000a R_X86_64_32 0000000000000000 .text + 8[ ... ]
这个 ELF 部分条目说:
.text
部分中的偏移量 1
R_X86_64_32
)。这可能旨在用于 32 位代码,但在 64 位非 PIE 可执行文件中,这仍然是将地址放入寄存器的最有效方式;对于 R_X86_64_PC32
RIP 相对重定位,小于 lea 1f(%rip), %0
。是的,将 RIP 相关的 LEA 放入 32 位寄存器是合法的,如果您不关心截断地址,则可以节省一个字节的机器代码。.text + 8
(必须在链接/加载时计算)这个条目是通过 mov $1f, %0
指令创建的。如果您将其遗漏(或只写 return *address
),它就不会出现。
我通过删除 static
限定符强制为上面的代码生成;如果不这样做,一个简单的编译实际上根本不会创建任何代码(static
代码如果不使用就会被删除,而且很多时候如果使用则内联)。
由于该函数是 static
的事实,如前所述,它通常会由编译器在调用站点内联。因此,使用它的信息通常会丢失,调试器检测它的能力也是如此。但是这里显示的技巧可以(间接)恢复它,因为每次使用该函数都会创建一个重定位条目。除此之外,像这样的方法可以用来在二进制文件中建立检测点;在可通过目标文件格式恢复的位置插入众所周知/严格定义但功能上无意义的小型汇编语句,然后让例如调试器/跟踪实用程序在需要时用“更有用”的东西替换它们。
关于c - 需要弄清楚以下内联汇编代码的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14922022/
这个问题在这里已经有了答案: standalone parentheses in javascript [duplicate] (5 个答案) 关闭 8 年前。 我在学习JavaScript,有时会
我是mysql新手,我必须减少以下更新查询的执行时间 UPDATE temp_countcalculations, ( SELECT count(*) as insuffcounts,CRP_
def escape_html(s): for (i, o) in (("&","&"),(">", ">"),(" "变成 ">"等。 关于python - 以下 for 循环
if (read(read(cin, data1), data2)) 问题是C++ Primer 5th Edition 的练习。 read 函数定义如下: std::istream &read(st
我想创建两个宏。其中一个将扩展到函数原型(prototype)和函数内容,另一个将扩展到仅函数原型(prototype)。我正在考虑创建以下内容: #ifdef SOME_CONDITION #def
我正在使用 jongo API - org.jongo.MongoCollection 是类。 我有对象 ID 列表并转换为与 ObjectId[] 相同并尝试按如下方式查询 collection.f
有人可以解释以下正则表达式匹配什么吗? ^.*$ 谢谢! 最佳答案 或者整个字符串或者整行,取决于是否multiline mode被使用。 关于java - 以下 ^.*$ 正则表达式匹配什么?,我们
#include void main() { int a,b,c; for(b = c = 10; a = "- FIGURE?, UMKC,XYZHello Folks,TFy!QJ
我的代码段中的以下代码行被 Sonar 检测为问题。 代码段: final int Pending=1; Sonar 问题: Name 'Pending' must matc
Print name of all activities with neither maximum nor minimum number of participants 我尝试了以下查询,但出现错误:
这个问题在这里已经有了答案: What is this practice called in JavaScript? (7 个回答) 关闭8年前。 (function() { //do stuff
根据任务,我们必须通过 foldr 实现 foldl。通过比较函数签名和 foldl 实现,我得到了以下解决方案: myFoldl :: (a -> b -> a) -> a -> [b] -> a
这个问题在这里已经有了答案: Export an es6 default class inline with definition or at end of file? (1 个回答) 关闭 2 年
据我了解,以下是相同的: Person p{}; // Case 1 Person p = {}; // Case 1.5 我注意到 Person p = Person{}; // Case 2 产生
below i have given a javascript code picture `` can any one help me in this code. what do this code.
我想在标题和正文上搜索全文,并在答案计数上进行过滤。 我阅读了elasticsearch documentation for combining filters并构建了此查询。 "query": {
它是流动的 C 代码中的内存泄漏吗? #include int *a; int main() { a = malloc(sizeof(int)*10); return
这两个声明有什么区别: char (*ptr)[N]; 对比 char ptr[][N]; 谢谢。 最佳答案 (1)声明 char (*ptr)[N]; ptr 是指向大小为 N 的字符数组的指针 下
data II = I Int Int deriving (Show) instance II Show where show I a b = show (a+b) showt.hs:3:2: s
我从 clojuredoc 中阅读了关于 condp 的文档。在文档中我找到了以下代码: (condp 一些 [1 2 3 4] #{0 6 7} :>> 公司 #{4 5 9} :>> 十二月 #{
我是一名优秀的程序员,十分优秀!