【发布时间】:2016-03-02 09:50:19
【问题描述】:
这是一个 C 语言的 Hello World 代码:
// a.c
#include <stdio.h>
int main() {
printf("Hello world\n");
return 0;
}
我将它编译为gcc a.c,它按预期生成a.out,./a.out 按预期打印Hello world...。
现在,如果我分别进行编译和链接:
gcc -c a.c; ld -lc a.o,它运行 a.out 生成为 ./a.out 我收到消息:
bash: ./a.out: No such file or directory
我用谷歌搜索了那个错误,似乎当生成的可执行文件是 32 位 ELF 并且机器架构是 64 位时会发生这种情况。
我正在运行 64 位机器并运行 file a.out 给出:
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
为什么会这样?
编辑:
uname -m的输出
$ uname -m
x86_64
ldd a.out的输出
$ ldd a.out
linux-vdso.so.1 => (0x00007ffeeedfb000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa13a7b8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa13abab000)
gcc a.c 生成运行正确的a.out。
【问题讨论】:
-
64 位机器并不一定意味着 64 位操作系统。
uname -m的输出是什么? -
ldd a.out产生什么?当您执行gcc a.c时会发生什么? -
将输出添加为问题的编辑
-
可以执行:gcc -v a.c 并检查链接阶段(是否需要与启动对象链接通常crt0.o)
-
为什么不想让 gcc 处理链接?
标签: c linux gcc linker dynamic-linking