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 的类型是STRTAB。但它没有设置标志。对于 /bin/true 它是相似的。
Flag: SHF_STRINGS: Contains null-terminated strings
Type: SHT_STRTAB: String table
好吧,这似乎是多余的。String 标志曾经独立于 String 类型使用过吗?
我没有在System V Application Binary Interface, Edition 4.1(草稿,1997 年 3 月 18 日)文档中看到该
SHF_STRINGS
属性(在查看维基百科条目时找到),但确实在System V ABI 更新(2009 年 10 月)中找到它;它显然是在第二稿(1999 年 5 月 3 日)中添加的,但修订历史并未说明添加它的原因。这似乎是与属性一起引入的,可能是为了不会意外合并字符串表和非字符串表(?)。但是,据我所知,没有对字符串表外部的引用(以及如何受到标记为SHF_MERGE
SHF_STRINGS
SHF_MERGE
SHF_STRINGS
),也不在 LSB 或特定于体系结构的文档中。因此,从理论上讲,该
SHF_STRINGS
属性似乎可用于标记除包含以 null 结尾的字符串的字符串表之外的部分,但我没有看到任何时候发生这种情况。也许有人利用了这个规定,但我找不到任何例子。