.shstrtab 部分没有包含空终止字符串的标志

.shstrtab 部分没有包含空终止字符串的标志

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可以用于标记除字符串表之外的包含空终止字符串的部分,但我没有看到任何时候发生这种情况。也许有人利用了该规定,但我找不到任何这样的例子。

相关内容