【发布时间】:2012-05-15 00:06:10
【问题描述】:
我正在 Linux 上尝试纯静态链接的 PIE 可执行文件的概念,但遇到了一个问题,即 GNU binutils 链接器在使用 -pie 时坚持在输出二进制文件中添加 PT_INTERP 标头,即使在还给了-static。有没有办法抑制这种行为?也就是说,有没有办法专门告诉 GNU ld 不要将某些标头写入输出文件?也许使用链接器脚本?
(请不要回答声称它不起作用;我很清楚该程序仍然需要重定位处理 - 加载地址相对重定位只是因为我使用了-Bsymbolic - 我有特殊的启动代码代替标准Scrt1.o 来处理这个问题。但是如果没有动态链接器已经启动并完成工作,我无法调用它,除非将PT_INTERP 标头从二进制文件中十六进制编辑出来。)
【问题讨论】:
-
让我看看我是否直截了当。您正在指定自己的入口点,这反过来又处理一些自定义重定位,并且您不希望内核在标准解释器中加载?如果您要链接需要通过.init 运行初始化的库怎么办?根据我的经验,如果你想对你的可执行文件做一些事情,但是没有办法通过 LDFLAGS 的一些排列来生成它,那么这不是一个好主意。
-
如果我想把它放在应用程序的构建系统中,我会 100% 同意你的看法。对于一个应用程序来使用像这样的链接器选项是一个可怕的黑客,它无论如何都不会工作,因为它需要将所有
.a库构建为 PIC。但是,我正在研究的是一个新的工具链选项,旨在用于面向安全的发行版,其中为 setuid 二进制文件运行动态链接器是不可接受的风险。如果在ld级别不需要更改,那么部署会容易得多,只需在 gcc 规范文件和crt级别。 -
看起来你必须为 ld 编写一个补丁,然后与他们争论为什么应该将它应用于主干。而且,这听起来很有趣。
-
如果可以使用链接器脚本,那将不如仅使用命令行选项理想,但比内部修补要好得多。非常感谢精通链接器脚本的人的回答。
-
一开始需要省略吗?即,构建后的 Make(或任何您喜欢的)步骤是否足以剥离
PT_INTERP标头?
标签: c static-linking dynamic-linking binutils pie-chart