如何在Linux中创建静态链接的位置无关可执行ELF?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在Linux中创建静态链接的位置无关可执行ELF?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2609字,纯文字阅读大概需要4分钟。
内容图文
![如何在Linux中创建静态链接的位置无关可执行ELF?](/upload/InfoBanner/zyjiaocheng/945/6871efd4bda8438fabc6e55d42827b33.jpg)
我有一个工作职位独立的Linux独立x86_64你好世界:
电源
.text
.global _start
_start:
asm_main_after_prologue:
/* Write */
mov $1, %rax /* syscall number */
mov $1, %rdi /* stdout */
lea msg(%rip), %rsi /* buffer */
mov $len, %rdx /* len */
syscall
/* Exit */
mov $60, %rax /* syscall number */
mov $0, %rdi /* exit status */
syscall
msg:
.ascii "hello\n"
len = . - msg
我可以组装和运行它:
as -o main.o main.S
ld -o main.out main.o
./main.out
由于RIP relative load,它是与位置无关的,所以我现在想link it as a PIE and see it get loaded at random addresses every time找点乐子.
首先,我尝试了:
ld -pie -o main.out main.o
但随后运行失败并显示以下信息:
-bash: ./main.out: No such file or directory
readelf -Wa说,出于某种原因,使用了奇怪的解释器/lib/ld64.so.1而不是常规的解释器/lib64/ld-linux-x86-64.so.2.
然后,我在5.2.1“程序解释器”中了解到他实际上是推荐的System V AMD64 ABI解释器的名称.
无论如何,我然后尝试通过以下方法强制解决问题:
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o main.out main.o
现在它可以工作了:我打招呼,并且根据GDB每次都将可执行文件加载到另一个地址.
最后,作为最后一步,我还想使该可执行文件静态链接,以使事情变得更加微不足道,并有可能摆脱显式的-dynamic-linker.
那就是我做不到的,这就是为什么我在这里问.
如果我尝试以下任一方法:
ld -static -pie -o main.out main.o
ld -static -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o main.out main.o
-static似乎没有什么区别:我仍然得到dynamic executables.
在fs/binfmt_elf.c中快速浏览内核5.0源代码后,我看到了这个有趣的注释:
* There are effectively two types of ET_DYN
* binaries: programs (i.e. PIE: ET_DYN with INTERP)
* and loaders (ET_DYN without INTERP, since they
* _are_ the ELF interpreter). The loaders must
所以我想当我实现自己想要的功能时,我将拥有一个有效的解释器,因此,我将使用自己的最小hello世界作为另一个程序的解释器.
我稍后可能会尝试的一件事是查看某些libc实现如何编译其加载程序并复制它.
相关问题:Compile position-independent executable with statically linked library on 64 bit machine但是提到了一个外部库,因此希望它是最小的和可回答的.
在Ubuntu 18.10中测试.
解决方法:
您要在链接命令中添加–no-dynamic-linker:
$ld main.o -o main.out -pie --no-dynamic-linker
$file main.out
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
$./main.out
hello
so I guess when I achieve what I want, I will have a valid interpreter, and I’m so going to use my own minimal hello world as the interpreter of another program.
我不确定我是否理解您的正确说法.如果您要使main.out本身具有其解释器,那就错了.
附言GLIBC-2.27 added support用于-static-pie,因此您不再需要借助汇编程序来获取静态链接的PIE二进制文件.但是您必须使用最近的GCC和GLIBC.
内容总结
以上是互联网集市为您收集整理的如何在Linux中创建静态链接的位置无关可执行ELF?全部内容,希望文章能够帮你解决如何在Linux中创建静态链接的位置无关可执行ELF?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。