【发布时间】:2015-12-20 15:21:58
【问题描述】:
我有一个关于 ELF 动态符号表的问题。对于 FUNC 类型的符号,我注意到某些二进制文件中的值为 0。但在其他二进制文件中,它有一些非零值。这两个二进制文件都是由 gcc 生成的,我想知道为什么会有这种差异?是否有任何编译器选项可以控制这一点?
编辑:这是 readelf --dyn-syms prog1 的输出
Symbol table '.dynsym' contains 5 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
2: 000082f0 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.4 (2)
3: 00008314 0 FUNC GLOBAL DEFAULT UND abort@GLIBC_2.4 (2)
4: 000082fc 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.4
这里“printf”符号的值是82f0,恰好是printf的plt表条目的地址。
readelf --dyn-syms prog2 的输出
Symbol table '.dynsym' contains 6 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
2: 00000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.4 (2)
3: 00000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.4 (2)
4: 00000000 0 FUNC GLOBAL DEFAULT UND abort@GLIBC_2.4 (2)
5: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.4
这里所有符号的值都是零。
【问题讨论】:
-
创建 prog1 和 prog2 的确切命令是什么?
-
prog2: gcc -o prog2 prog2.c。但是关于prog1,我不知道。我想知道是否有任何选项可以创建此类二进制文件。