c - 在文本部分查找字符串

标签 c gcc

我以下面的代码为例:

Foo( "Test1" );

void Foo(const char* const i_Test )
{
     // Some logic
}

Foo() 中的 i_Test 指针持有指向 .rodata 部分 中的字符串的指针。

有没有办法在二进制文件中搜索i_Text指针值来找到相关的String?或者我可以使用将保存该信息的 gcc 生成任何调试信息吗?

最佳答案

如果您谈论的是 ELF 文件格式,常量字符串存储在 .rodata (read-only-data) 部分.基本上,只有程序的指令(代码)存储在该二进制文件的 .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

在上面的示例代码中,您传递给 Foo 函数的 "Test1" 字符串将被 编译器< 视为常量字符串/em>。因此,您可以在加载阶段之前找到它的相对内存地址,i_Test 指针将指向这个常量字符串。但是,如果您将代码编译为 position independent (通过使用 gcc 中的 -fPIC 选项),您可能还会发现编译器会向该只读 writable 属性添加 strong>.rodata 部分。此外,您还可以使用 readelf用于显示有关 ELF 格式目标文件各部分的详细信息的二进制实用程序。

可以找到有关 ELF 文件格式的更多信息 here

关于c - 在文本部分查找字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29935915/

相关文章:

c - scanf 中的最后一个字符

linux - 在 Fedora 25 上使用 LD_PRELOAD 导致 Segmentation Fault

c++ - 这段 C++ 代码如何在 GCC 而不是 Visual C++ 中运行?

c - 为什么使用 -O(1/2/3) 选项进行优化会干扰 scanf()?

c - 如何编译交叉编译器arm-linux-eabi-gcc?

c - GTK 3.0 给出编译器错误 "Only <gdk/gdkh> can be included directly"

c - C/gtk+ 中的全局列表

c - 为什么一种 malloc 段错误,而另一种却没有?

c - 将标准输出传递给 C 程序

c - DS18b20 BBB在C代码中读取温度的问题