【发布时间】:2013-03-06 03:56:31
【问题描述】:
我最近一直在 linux 上玩 x86 64 位汇编,在编译了一个看似简单的程序后,我只能摸不着头脑:P
虽然我编译和链接它不会抛出任何错误并产生一个 linux ELF 当我尝试运行它时,我得到:
.:[ h4unt3r@sp3ctr4l-h0st asm ]:.
#(0)> ./hello
bash: ./hello: No such file or directory
我假设它产生了一个无效的 ELF 文件,这就是为什么它报告 hello 不存在,即使它是。不知道为什么-我可能会继续玩它,只是好奇这是否可以通过简单的方法解决^_^
这是我的编译/链接命令行:
nasm -f elf64 hello.s -g
ld -o hello hello.o -lc
代码如下:
section .data
msg: db "Hello, world!",0xa,0
section .text
extern printf
global main
main:
push rbp
mov rbp, rsp
mov rdi, msg
xor rax, rax
call printf
xor rax, rax
pop rbp
ret
编辑——我不想使用 gcc :)
【问题讨论】:
-
如果它有任何价值,如果你删除 -lc 标志并注释掉 printf 的 extern,文件就可以工作。
-
你怎么看? :) 那么 printf 是未定义的符号...
-
其实我也把 printf 调用注释掉了,但我的意思是,如果文件没有与 libc 链接,它可以正常工作。
-
你又是怎么想的? :) 你在使用 ld 吗?因为 gcc 为你做了所有正确的链接......就像 incldugin libs 所以如果你做 -nostdlib 或 -nodefaultlibs 它将失败并出现未定义的符号
-
这是我用来链接的命令。可能链接不完整导致程序无法正确加载。也许有更好的知识的人可以解释一下。 ld -o hello /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o hello.o /usr/lib/gcc/x86_64-linux -gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -lc --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn。 o -dynamic-linker /lib64/ld-linux-x86-64.so.2
标签: linux assembly 64-bit x86-64 nasm