c - PIC(位置无关代码)

标签 c gcc compiler-construction linker fpic

有什么方法可以检查目标文件(.o 文件)是否启用了 PIC?

最佳答案

不确定这有多便携,但对于 x86 和 x86_64,ELF 格式,您可以使用 readelf -r 并查看重定位类型。

对于 32 位 PIC 代码,您应该有一个 R_386_GOTPC 重定位部分:

Relocation section '.rel.text' at offset 0x38c contains 3 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000004  00000902 R_386_PC32        00000000   __i686.get_pc_thunk.cx
0000000a  00000a0a R_386_GOTPC       00000000   _GLOBAL_OFFSET_TABLE_
00000010  00000803 R_386_GOT32       00000000   f

非 PIC .o 不应存在这样的节。 (您还会在 readelf -s 输出中看到一个全局偏移表。)

对于 64 位,同样的事情,但具有 R_X86_64_GOTPCREL 重定位类型。我很确定所有重定位类型名称都直接指示代码是否为 PIC,但我现在找不到引用。

关于c - PIC(位置无关代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5895388/

相关文章:

c - yocto 项目中的 do_rootfs 函数失败

c++ - 具有扩展字符 (128-255) 的 Linux 中的 open() 函数返回 -1 错误

c - mongo c 驱动程序更新嵌套数组

c - 如何使用<从文本文件中读取一整行

debugging - Visual Studio附加到流程如何工作?

c++ - 使用 C 或 C++ 运行本地服务器的最佳方法

java - 通过 JNI 在 C 和 Java 之间传递指针

从技术上讲,使用 -O3 编译 gcc 会增加我的缓存未命中率

c - 如何用AST树或其他工具做静态代码逻辑分析?

flex 和 bison 的通用标记