R..*_*R.. 20 c dynamic-linking binutils static-linking pie-chart
我正在试验Linux上纯静态链接的PIE可执行文件的概念,但是遇到了GNU binutils链接器在使用时坚持在输出二进制文件中添加PT_INTERP头的问题-pie,即使在给出时也是如此-static.有没有办法抑制这种行为?也就是说,有没有办法告诉GNU ld具体不要将某些标题写入输出文件?也许使用链接器脚本?
(请不要回答声称它不起作用;我很清楚该程序仍然需要重定位处理 - 仅由于我的使用而导致的加载地址相对重定位-Bsymbolic- 并且我有特殊的启动代码代替Scrt1.o处理这个问题的标准.但是,如果没有动态链接器已经开始并且正在进行工作,除非PT_INTERP将二进制文件中的标题变为十六进制,否则我无法调用它.)
rod*_*igo 13
也许我是天真的,但是...不足以搜索默认的链接描述文件,编辑它,并删除该.interp部分中链接的行?
例如,在我的机器中,脚本在,/usr/lib/ldscripts并且有问题的行在interp : { *(.interp) }该SECTIONS部分中.
您可以转储运行以下命令时使用的默认脚本:
$ ld --verbose ${YOUR_LD_FLAGS} | \
gawk 'BEGIN { s = 0 } { if ($0 ~ /^=/) s = !s; else if (s == 1) print; }'
Run Code Online (Sandbox Code Playgroud)
您可以gawk稍微修改脚本以删除该interp行(或者只grep -v使用该脚本来链接您的程序.
R..*_*R.. 11
我想我可能找到了一个解决方案:简单地使用-shared而不是-pie制作馅饼二进制文件.您需要一些额外的链接器选项来修补该行为,但它似乎避免了对自定义链接描述文件的需要.或者换句话说,-shared链接器脚本已经基本上正确用于链接静态饼图二进制文件.
如果我使用它,我将使用我正在使用的确切命令行更新答案.
更新:它的工作原理!这是命令行:
gcc -shared -static-libgcc -Wl,-static -Wl,-Bsymbolic \
-nostartfiles -fPIE Zcrt1.s Zcrt2.c /usr/lib/crti.o hello.c /usr/lib/crtn.o
Run Code Online (Sandbox Code Playgroud)
其中Zcrt1.s是Scrt1.s的修改版本,它在执行正常工作之前调用Zcrt2.c中的函数,并且Zcrt2.c中的代码处理刚刚经过argv和环境数组的辅助向量以找到DYNAMIC部分,然后遍历重定位表并应用所有相对类型的重定位(唯一应该存在的重定位).
现在所有这些都可以(通过一些工作)包装到脚本或gcc规范文件中......