概况
在AMD64架构下的机器,当我们使用nasm与C语言混合编程的时候,需要注意到的是nasm的默认编译产生的是32位目标代码。而gcc在64位的机器上则默认产生的是64位目标代码
这么看来,机器位数并不是越高越好啊
正文
我们在64位机器上使用nasm编译汇编与C混合调用时候
nasm -f elf foo.s -o foo.o
gcc -c bar.c -o bar.o
ld -s -o foobar bar.o foo.o
此时出现错误为
ld: i386 architecture of input file `foo.o' is incompatible with i386:x86-64 output
而原因则是因为在64位机器上的gcc编译为64位目标代码,而nasm则编译为是32位目标代码
所以在编译链接的时候我们应该改为
nasm -f elf foo.s -o foo.o
gcc -m32 -c bar.c -o bar.o
ld -m elf_i386 -s -o foobar foo.o bar.o
并且在构建32位目标代码时需索所依赖的包
包管理下载即可
sudo apt-get install libc6-dev-i386