readelf -S a.out
输出:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Ar
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 08048060 000060 000013 00 AX 0 0 16
[ 2] .rodata PROGBITS 08048074 000074 00000b 00 A 0 0 4
[ 3] .shstrtab STRTAB 00000000 00007f 000019 00 0 0 1
.shstrtab 的类型是斯特拉塔布。但它没有设置标志。对于 /bin/true 来说是类似的。
Flag: SHF_STRINGS: Contains null-terminated strings
Type: SHT_STRTAB: String table
嗯,这似乎是多余的。 String 标志是否独立于 String 类型使用?
答案1
我没有看到该SHF_STRINGS
属性System V 应用程序二进制接口,版本 4.1(草稿,1997年3月18日)文档(翻阅时发现维基百科条目),但确实发现它列在System V ABI 更新(2009 年 10 月);它显然是添加在第二稿(1999年5月3日),但修订历史并没有表明添加它的原因。看来这是与SHF_MERGE
属性一起引入的,可能是为了字符串表和非字符串表不会意外合并(?)。然而,据我所知,没有对SHF_STRINGS
字符串表外部的引用(以及如何SHF_MERGE
受 标记的条目的影响SHF_STRINGS
),也没有在 LSB 或特定于体系结构的文档中。
因此,从理论上讲,该属性似乎SHF_STRINGS
可以用于标记除字符串表之外的包含空终止字符串的部分,但我没有看到任何时候发生这种情况。也许有人利用了该规定,但我找不到任何这样的例子。