为了获得可重现的构建,我们在编译时使用
--ffile-prefix-map=/path/to/src=SRC --file-prefix-map=/path/to/lib=LIB
选项。同样,对于 gdb
我可以 set substitute-path SRC=/path/to/src
等等
但是,我不知道如何用
objdump -S
做类似的事情。我可以用一个小迷宫的符号链接来解决它,但我不理解 --prefix
的 objdump
选项,也不知道它是否是正确的使用方法。我尝试了--prefix-strip=1 --prefix=/path/to/src
,但它似乎没有达到我的预期(嗯,它没有设法包含任何源代码!)
有什么办法可以做到这一点吗?
经过一些实验并快速了解 objdump
实用程序的
源代码之后,我成功实现了预期的结果。这可能会令人费解,因为我没有做任何特别的事情,但一切都按预期进行。
首先,我创建了一个简单的“Hello, world!”程序位于名为
test.c
: 的文件中
#include <stdio.h>
int main(int argc, char** argv) {
printf("Hello, world!\n");
}
使用以下命令编译它:
gcc -Wall -ggdb -ffile-prefix-map=/path/to/cwd=/src test.c -o test
使用
strings test | grep /src
验证 /src
已进入生成的 test
二进制文件,因此是时候使用以下命令让 objdump -S
查找源文件了:
objdump -S --prefix=/path/to/cwd --prefix-strip=1 test
这是生成的输出的摘录,其中显示了反汇编代码中所需的源代码片段:
0000000000000744 <main>:
#include <stdio.h>
int main(int argc, char** argv) {
744: a9be7bfd stp x29, x30, [sp, #-32]!
748: 910003fd mov x29, sp
74c: b9001fe0 str w0, [sp, #28]
750: f9000be1 str x1, [sp, #16]
printf("Hello, world!\n");
754: 90000000 adrp x0, 0 <__abi_tag-0x278>
758: 91204000 add x0, x0, #0x810
75c: 97ffffb1 bl 620 <puts@plt>
760: 52800000 mov w0, #0x0 // #0
}
764: a8c27bfd ldp x29, x30, [sp], #32
768: d65f03c0 ret
76c: d503201f nop
因此,您所使用的环境中一定存在某些问题。也许最好先尝试重现一个像这样的简单示例,看看它是否能按预期工作。