加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 无法运行与libc链接的可执行文件

发布时间:2020-12-13 19:04:25 所属栏目:Linux 来源:网络整理
导读:我用以下命令组装我的hello世界: nasm -f elf64 test.asm 然后我链接到这个: ld -s test.o -lc 我知道这很有效,因为文件a.out显示了我 a.out:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),剥离 但是,当我使用./a.out运行时,我得到bash

我用以下命令组装我的hello世界:

nasm -f elf64 test.asm

然后我链接到这个:

ld -s test.o -lc

我知道这很有效,因为文件a.out显示了我

a.out:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),剥离

但是,当我使用./a.out运行时,我得到bash:./ a.out:没有这样的文件或目录

没有libc的链接运行正常!如何让我的libc链接exe运行?

最佳答案
当前的问题是ld默认使用/lib/ld64.so.1作为解释器,你可能会错过它(它可以是/lib64/ld-linux-x86-64.so.2或任何合适的符号链接) ):

$readelf -l a.out | grep interpreter
      [Requesting program interpreter: /lib/ld64.so.1]
$ls -l /lib/ld64.so.1
ls: cannot access /lib/ld64.so.1: No such file or directory

您可以通过将-dynamic-linker /lib64/ld-linux-x86-64.so.2选项传递给您的ld调用来显式设置解释器来解决此问题:

$ld -s -dynamic-linker /lib64/ld-linux-x86-64.so.2 test.o -lc
$readelf -l a.out | grep interpreter
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
$./a.out
$

然而,简单的经验法则是使用gcc进行链接,如果你需要libc,它会为你做一切.还要确保使用main作为入口点,以便正常的libc启动代码有可能初始化.同样,只需从主端返回,不要直接使用exit syscall(如果你真的需要,可以使用libc的exit函数).通常,不建议使用系统调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读