我可能做错了什么,做个新手。你能帮帮我吗?
我在C中编写了一个名为hello.c的简单Hello World程序,并运行以下命令:
gcc -S hello.c
那产生了hello.s
。然后我将该文件与GNU汇编程序as
:
as hello.s
哪个产生了一个不可执行的a.out
,仍然需要链接,我明白了吗?
我尝试使用ld
链接它,如下所示:
ld a.out
但是得到以下错误:
a.out: file not recognized: File truncated
ld
删除了我的文件。
这是一个x86 Ubuntu系统。我究竟做错了什么?非常感谢!
答案 0 :(得分:6)
我的第一个问题是:你为什么要汇编代码?如果你想要汇编程序代码,请务必使用gcc -S
来获取它(我猜是为了查看)。
但是你不需要通过as
来继续运行,只需使用:
gcc -o hello hello.c
gcc -S hello.c
第一步将C源直接转换为可执行文件,第二步将为您提供汇编源。
您的具体问题可能是ld
尝试将其输出写入a.out
。如果这也是您的输入文件,它可能会在运行ld
的过程中被销毁。您可以尝试在运行ld命令之前将a.out
重命名为a.in
:ld a.in
。
答案 1 :(得分:5)
我是这样做的:
> gcc -S forums.c
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums
test
为什么要调用gcc
而不是ld
?因为GCC负责链接C运行时,并执行其他依赖于实现的内容。如果您想查看,请使用--verbose
选项:
> gcc --verbose forums.o -o forums
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Thread model: posix
gcc version 4.4.0 (GCC)
COMPILER_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'forums' '-mtune=generic'
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o forums /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../.. forums.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o
答案 2 :(得分:3)
ld
正在写入a.out
(其默认输出文件),同时从中读取。尝试这样的事情:
ld a.out -o myprog
答案 3 :(得分:1)
重新安装glibc-devel并检查它是否有效。这个过程对我有用。