我有以下代码示例:
Foo( "Test1" );
void Foo(const char* const i_Test )
{
// Some logic
}
i_Test
中的Foo()
指针包含指向.rodata section
中字符串的指针。
有没有办法搜索二进制文件中的i_Text
指针值来查找相关的字符串?或者我可以使用保存该信息的gcc
生成任何调试信息吗?
答案 0 :(得分:4)
如果您正在讨论 ELF 文件格式,则常量字符串存储在 .rodata (只读数据)部分中。基本上,只有程序的指令(代码)存储在该二进制文件的 .text 部分中。您可以使用对象转储程序(例如objdump)来调查这些部分,如下所示:
objdump -drS program.o // to see .text section of your program
objdump -s -j .rodata program.o // to see .rodata section of your program
在上面的示例代码中,传递给"Test1"
函数的Foo
字符串将被编译器视为常量字符串。因此,您可以在加载阶段之前找到它的相对内存地址,i_Test
指针将指向此常量字符串。但是,如果您已将代码编译为position independent(在 gcc 中使用-fPIC
选项),您可能还会发现编译器将添加可写属于该只读 .rodata 部分。此外,您还可以使用readelf二进制实用程序来显示有关ELF格式的目标文件部分的详细信息。
有关 ELF 文件格式的更多信息,请参阅here
答案 1 :(得分:2)
实际上,常量字符串不会保存在.text部分中,而是保存在.rodata部分中。
为了查看所有常量字符串,您可以运行:
readelf -S ./[your binary file]
请注意上面输出中.rodata部分的部分编号
readelf -p [.rodata section number you got before] ./[your binary name]
这个命令的作用是打印一个部分内的所有字符串,因为字符串是常量数据,你将获得文件中的所有字符串。您还可以通过计算.rodata节地址及其中的偏移来更改这些字符串,但我发现打开十六进制编辑器,查找字符串并对其进行操作要容易得多(假设我没有更改为更长的字符串)字符串)
修改
您可以直接使用readelf -p .rodata
,而不是提供章节号