PIC(位置无关代码)

发布于 2024-11-05 02:17:07 字数 37 浏览 6 评论 0原文

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

Is there any way to check if an object file(.o file) is PIC-enabled?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

荒芜了季节 2024-11-12 02:17:07

不确定它的可移植性如何,但对于 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,但我现在找不到参考。

Not sure how portable this is, but for x86 and x86_64, ELF format, you can use readelf -r and look at the relocation types.

For 32bit PIC code, you should have a R_386_GOTPC relocation section:

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

No such section section should exists for non-PIC .os. (You'll also see a global offset table in the readelf -s output.)

For 64bit, same thing but with a R_X86_64_GOTPCREL relocation type. I'm pretty sure all the relocation type names are directly indicative of whether the code is PIC or not, but I can't find a reference right now.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文