我正在阅读 System V ABI 和 Linux Standard Base 规范中的 ELF 文件。关于符号表部分 System V 说
目前,一个目标文件每种类型只能有一个部分,但这一限制将来可能会放宽。 通常,SHT_SYMTAB 提供用于链接编辑的符号,尽管它也可用于动态链接。作为一个完整的符号表,它可能包含许多动态链接不必要的符号。 因此,目标文件还可能包含 SHT_DYNSYM 部分, 它保存动态链接符号的最小集合,以节省空间。
虽然LSB似乎明确禁止它
当前,目标文件可以具有 SHT_SYMTAB 类型的部分或 SHT_DYNSYM 类型的部分,但不能同时具有两者。 此限制将来可能会放宽。 通常,SHT_SYMTAB 提供用于链接编辑的符号,尽管它也可用于动态链接。作为一个完整的符号表,它可能包含许多动态链接不需要的符号。
因此,我用粗体标记的部分直接相互矛盾。同时,我斜体部分是逐字复制的,这让我怀疑 LSB 在从 System V 复制时可能犯了错误(即粗体部分)?
因此我的问题是,哪一个是正确的? Linux下一个目标文件可以同时有两个部分吗?
您引用的文本似乎来自此处。
它似乎也是完全伪造的:ELF(共享)对象同时具有 SHT_SYMTAB
和
SHT_DYNSYM
部分是非常常见的。示例:echo "int foo() { return 42; }" | gcc -xc - -fPIC -shared -o foo.so
readelf -WS foo.so | egrep 'SYMTAB|DYNSYM'
[ 3] .dynsym DYNSYM 0000000000000288 000288 000090 18 A 4 1 8
[21] .symtab SYMTAB 0000000000000000 003028 000258 18 22 20 8