当您列出静态库的符号表时,例如nm mylib.a
,每个符号旁边显示的8位十六进制是什么意思?这是代码中每个符号的相对位置吗?
此外,多个符号可以具有相同的符号值吗?一堆符号值为00000000的不同符号是否有问题?
Ed *_*rel 24
这是我在C中写的一段代码:
#include
#include
void foo();
int main(int argc, char* argv[]) {
foo();
}
void foo() {
printf("Foo bar baz!");
}
Run Code Online (Sandbox Code Playgroud)
我跑gcc -c foo.c
了那段代码.这是nm foo.o
显示:
000000000000001b T foo 0000000000000000 T main U printf
对于这个例子,我正在运行Ubuntu Linux 64位; 这就是为什么你看到的8位十六进制数字在这里是16位数.:-)
您看到的十六进制数字是目标文件中相对于该.text.
部分开头的相关代码的地址.(假设我们处理从0x0开始的目标文件的部分).如果你运行objdump -td foo.o
,你会在输出中看到以下内容:
Disassembly of section .text: 0000000000000000 : 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 83 ec 10 sub $0x10,%rsp 8: 89 7d fc mov %edi,-0x4(%rbp) b: 48 89 75 f0 mov %rsi,-0x10(%rbp) f: b8 00 00 00 00 mov $0x0,%eax 14: e8 00 00 00 00 callq 19 19: c9 leaveq 1a: c3 retq 000000000000001b : 1b: 55 push %rbp 1c: 48 89 e5 mov %rsp,%rbp 1f: b8 00 00 00 00 mov $0x0,%eax 24: 48 89 c7 mov %rax,%rdi 27: b8 00 00 00 00 mov $0x0,%eax 2c: e8 00 00 00 00 callq 31 31: c9 leaveq 32: c3 retq
请注意,这两个符号与我们在符号表中看到的条目一致nm
.请记住,如果将此目标文件链接到其他目标文件,这些地址可能会更改.另外,请记住,callq
当您将此文件链接到系统提供的任何libc时,0x2c将会更改,因为这是对printf的不完整调用(它不知道它现在在哪里).
至于你mylib.a
,还有更多的事情发生在这里.您拥有的文件是存档; 它包含多个目标文件,每个目标文件都有自己的文本段.作为一个例子,这里是我的框中的/usr/lib/libm.a的nm的一部分
e_sinh.o: 0000000000000000 r .LC0 0000000000000008 r .LC1 0000000000000010 r .LC2 0000000000000018 r .LC3 0000000000000000 r .LC4 U __expm1 U __ieee754_exp 0000000000000000 T __ieee754_sinh e_sqrt.o: 0000000000000000 T __ieee754_sqrt e_gamma_r.o: 0000000000000000 r .LC0 U __ieee754_exp 0000000000000000 T __ieee754_gamma_r U __ieee754_lgamma_r U __rint
您将看到多个文本段已完成 - 由第二列中的T表示在地址0x0处,但每个单独的文件在0x0处只有一个文本段符号.
对于具有多个符号在同一地址休息单独的文件,好像它会是可能的也许.毕竟,它只是一个表中的一个条目,用于确定一块数据的位置和大小.但我不确定.我以前从未见过多个符号引用一个部分的相同部分.任何对此有更多了解的人都可以加入.:-)
希望这会有所帮助.
归档时间: |
|
查看次数: |
12354 次 |
最近记录: |