- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 ARM 二进制文件,我需要准确找到其函数序言结束和尾声开始的地址。换句话说,我需要函数体的边界。例如,如果我有一个函数,其程序集类似于:
0x00000320 <+0>: push {r7, lr}
0x00000322 <+2>: sub sp, #16
0x00000324 <+4>: add r7, sp, #0
0x00000326 <+6>: str r0, [r7, #4]
0x00000328 <+8>: (Function body starts here)
...
0x0000034c <+44>: (Function body ends here)
0x0000034e <+46>: mov sp, r7
0x00000350 <+48>: pop {r7, pc}
我需要一种方法来快速找到 0x00000326
和 0x0000034e
(序言结束/结尾开始)或 0x00000328
和 0x0000034c
(函数体开始/结束)使用类似 readelf 或 objdump 的东西。简单地反汇编它并检查代码是行不通的(理想情况下我会使用脚本来解析 readelf 的输出或我用来获取 DWARF 信息的任何程序)。
根据 DWARF 4 标准,.debug_line 部分应该包含行号信息,其中包括“prologue_end
”和“epilogue_begin
”,这正是我所需要的。但是,arm-linux-readelf --debug-dump=rawline,decodedline
的输出没有给我该信息。
我正在使用带有 -ggdb3
标志的 gcc 4.8.2
进行编译。
编辑:更多信息:objdump 和 readelf 都向我展示了这样的内容:
Line Number Statements:
[0x00000074] Extended opcode 2: set Address to 0x100
[0x0000007b] Advance Line by 302 to 303
[0x0000007e] Copy
[0x0000007f] Special opcode 34: advance Address by 4 to 0x104 and Line by 1 to 304
[0x00000080] Special opcode 34: advance Address by 4 to 0x108 and Line by 1 to 305
[0x00000081] Special opcode 37: advance Address by 4 to 0x10c and Line by 4 to 309
[0x00000082] Special opcode 34: advance Address by 4 to 0x110 and Line by 1 to 310
[0x00000083] Special opcode 20: advance Address by 2 to 0x112 and Line by 1 to 311
[0x00000084] Special opcode 37: advance Address by 4 to 0x116 and Line by 4 to 315
[0x00000085] Special opcode 34: advance Address by 4 to 0x11a and Line by 1 to 316
[0x00000086] Advance Line by -13 to 303
[0x00000088] Special opcode 19: advance Address by 2 to 0x11c and Line by 0 to 303
[0x00000089] Special opcode 34: advance Address by 4 to 0x120 and Line by 1 to 304
[0x0000008a] Advance PC by 4 to 0x124
[0x0000008c] Extended opcode 1: End of Sequence
查看 binutils 的 dwarf.c 的源代码,它似乎应该在行信息转储中打印类似“Set prologue_end to true”和“Set epilogue_begin to true”的内容。然而,所有的操作码似乎都是特殊的而不是标准的。
最佳答案
这是一个非常迟来的响应,但是:如果您正在使用 LLVM,那么您可以从 DWARF 行程序状态机获取此信息:LLVM 发出 DW_LNS_set_prologue_end
和 DW_LNS_set_epilogue_begin
作为每一行程序入口的标志。
GCC 显然(还)不支持这些属性,因此它的周边工具(如 readelf
和 gdb
)可能也不支持。但是你应该能够用 pyelftools
解析序言和结尾。 .
关于c - DWARF - 如何在给定的二进制文件中找到函数的序言结束/结尾开始地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25916970/
欢迎!这个系列的博文会带你使用golang语言来编写一个你自己的文本编辑器。 首先想说说写这个系列文章的动机。 其实作为校招生加入某头部互联网大厂一转眼已经快4年了。可以说该大厂算是比较早的用g
我想在序言中向数据库添加文本。就像是 adding :- tell('a.txt'), write('abc'), told. 但不会覆盖a.txt。我试过像这样使用append: append('a
我正在开发一款名为“狼山羊白菜”的益智游戏。编程语言是 Prolog。 change(e,w). change(w,e). move([X,X,Goat,Cabbage],wolf,[Y,Y,Goat
我对 Prolog 很陌生。 我有这样的图: edge(a,e). edge(e,f). edge(f,d). edge(d,a). 我将传递闭包定义为: p(X,Y) :- edge(X,Y). t
我想知道如何使用我拥有的元素获得一个漂亮的外观列表!我一直在尝试查找有关此内容的内容,但我发现的实际示例似乎都没有实际工作 这是我在网上找到的一种方法: create_list(Item, List,
我有一个使用约束用Sicstus Prolog编写的程序。 我的目标是使用labeling/2和其他方法来获取变量的随机实例化。 例子: X #> 2, Y #= 2*X, Z #<10 如果我用 L
我想知道,我知道你可以使用 assert添加事实或规则或其他任何内容,如果您已将谓词声明为 -:dynamic ,但这仅允许所做的更改仅保留在该 session 中,例如如果关闭 Prolog 窗口,
关于如何检索列表中重复次数最多的元素的任何想法。 即如下所示, ?- maxRepeated([1,2,7,3,6,1,2,2,3],M). M = 2. 最佳答案 我非常喜欢 Prolog 的关系功
my_reverse(L1,L2) :- my_rev2(L1,L2,[]). my_rev2([],L2,L2). my_rev2([X|Xs],L2,Acc) :- my_rev2(Xs,L2,[
我正在编写一个序言程序,该程序将检查两个数学表达式是否实际上相同。例如,如果我的数学表达式目标是:(a + b) + c,则以下任何表达式都被视为相同: (a+b)+c a+(b+c) (b+a)+c
我必须编写一个计算魔法矩阵的程序,我已经编写了我的代码并且它可以工作,但是我的排列非常慢。我需要一个更快的人可以帮助我请 这是代码: diabolico([A,B,C,D,E,F,G,H,I,J,K,
关于如何检索列表中重复次数最多的元素的任何想法。 即如下所示, ?- maxRepeated([1,2,7,3,6,1,2,2,3],M). M = 2. 最佳答案 我非常喜欢 Prolog 的关系功
我正在关注一个要求定义对称关系的 Prolog 教程。 例如,假设您在知识库中有以下事实: colleague(john,bob). 您还希望 colleague(bob,john) 是真实的,对于所
笔者从大学时期就开始接触的前端,在刚去实习的时候就被导师安排去做内网的一个小富文本工具。之后从毕业后干的第一份工作游戏客户端,到现在做着可视化相关的前端工作,都有在做富文本相关的内容。可以说是和 富文
我有一个对列表,想找到具有相应第一个值的元素。 ?- findconn1(9, [(9,[23,33]),(42,[21,322])], R). 所以在这种情况下,我希望结果是 (9,[23,23])
我试图让我的 ARM 围绕一些基本的序言,但在这个过程中有点挣扎。具体来说 - 我试图通过一个项目列表并将其逐项复制到一个新列表中。我可以让它反转,但我发现在不反转的情况下这样做会更棘手。 我一直在尝
当我的 friend 在学校开始学习 Prolog 时,我取笑他学习了无用的语言。然而,他向我展示了一些我什至不知道可能的东西;我想知道这个技术是从哪里来的。 技术是这样的: permutation(
我有下一条规则 % Signature: natural_number(N)/1 % Purpose: N is a natural number. natural_number(0). natura
我在理解为什么我在 prolog 中的代码根据我放置规则的顺序做某事时遇到了一些麻烦。 这是我的数据库: parent(tom, bob). parent(tom, liz). parent(mary
我正在尝试学习一些关于 swi-prolog 的知识(除了基本的、无用的程序)。 谁能解释(也许用伪代码)这个数独求解器和相关函数在做什么?如果您需要更多引用,可以在 swi-prolog 的 CLP
我是一名优秀的程序员,十分优秀!