我可能做错了什么,做个新手.你能帮帮我吗?
我在C中编写了一个名为hello.c的简单Hello World程序,并运行以下命令:
gcc -S hello.c
Run Code Online (Sandbox Code Playgroud)
那产生了hello.s.然后我用GNU汇编程序使用该文件as:
as hello.s
Run Code Online (Sandbox Code Playgroud)
哪个产生了非可执行文件a.out,哪些仍然需要链接,我明白了吗?
我尝试通过使用链接它ld,如下所示:
ld a.out
Run Code Online (Sandbox Code Playgroud)
但是得到以下错误:
a.out: file not recognized: File truncated
Run Code Online (Sandbox Code Playgroud)
并ld删除我的文件.
这是一个x86 Ubuntu系统.我究竟做错了什么?非常感谢!
我的第一个问题是:你为什么要组装代码?如果你想要汇编代码,一定要使用gcc -S它来获取它(我猜).
但是你不需要经过它as来继续前进,只需使用:
gcc -o hello hello.c
gcc -S hello.c
Run Code Online (Sandbox Code Playgroud)
第一步将C源直接转换为可执行文件,第二步将为您提供汇编源.
您的具体问题可能是ld尝试将其输出写入a.out.如果这也是你的输入文件,它可能会在运行过程中被销毁ld.你可以尝试重新命名a.out,以a.in运行ld命令之前:ld a.in.
我是这样做的:
> gcc -S forums.c
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums
test
Run Code Online (Sandbox Code Playgroud)
我为什么要调用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
Run Code Online (Sandbox Code Playgroud)