gcc 使用-ffile-prefix-map和objdump -S

xsuvu9jc  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(222)

为了获得可重现的构建,我们在编译时使用--ffile-prefix-map=/path/to/src=SRC --file-prefix-map=/path/to/lib=LIB选项。类似地,对于gdb,我可以set substitute-path SRC=/path/to/src等等。
但是,我不知道如何用objdump -S做类似的事情。我可以用一个小的符号链接迷宫来解决它,但是我不理解objdump--prefix选项,或者不知道它是否是正确的。我尝试了--prefix-strip=1 --prefix=/path/to/src,但它似乎没有做我所期望的(好吧,它没有设法包括任何源代码!)
有什么办法可以做到这一点吗?

irlmq6kh

irlmq6kh1#

经过一些实验和对objdump实用程序的源代码的快速了解,为了确保我从objdump(1)得到了正确的东西,我设法实现了预期的结果。这可能会令人困惑,因为我没有做任何特别的事情,但一切都如预期的那样。
首先,我创建了一个简单的“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

因此,在您使用的环境中,一定有什么东西不太正确。也许最好先复制一个像这样的简单示例,看看它是否能按预期工作。我希望这能帮上忙。
另请参阅this question以了解更多信息。

相关问题