我正在尝试用汇编语言学习C调用约定。为此,我使用C标准库中的puts
函数创建了一个简单的程序。
我使用以下命令组装并链接了该程序: -
nasm -f elf file.asm
gcc -m32 file.asm -o file
nasm会生成正确的目标文件,但在运行gcc链接目标文件时,我收到错误 看看这个错误,我发现我的系统上没有32位版本的glibc。我该怎么安装呢我已经安装了this软件包。
我有64位ubuntu 12.04作为我的操作系统。
编辑: - 我已安装以下软件包,但问题仍未解决: -
1)IA32-库
2)libc6-i386
答案 0 :(得分:16)
此命令将在64位Ubuntu上安装32位glibc库:
sudo apt-get install gcc-multilib
这是使用gcc:
将汇编对象代码编译为可执行文件的正确语法gcc -m32 objectfile.o -o executablefile
答案 1 :(得分:1)
我使用以下命令组装并链接了该程序: -
nasm -f elf file.asm
gcc -m32 file.asm -o file
这是错误的。您的第一个nasm
命令可能正在创建file.o
文件(您应该检查该文件,例如使用ls -l file.o
)。第二个gcc
命令没有按照您的意愿执行。
但gcc
不了解*.asm
文件扩展名(它知道.S
可预处理的GNU汇编语法,.s
代表汇编程序代码,但可能处理未知扩展像.asm
一样默认为ELF对象文件,但file.asm
不是ELF对象文件。你应该尝试用
gcc -Wall -v -m32 file.o -o file
请注意,您GCC object file ELF linker calling conventions x86-64 ABI spec ELF readelf gcc
}。
(您稍后可能会将nasm
选项移至-v
)
或者,使用GNU gcc
汇编语法(不是 nasm ),命名文件as
(如果您希望对其进行预处理)或{{1 (没有预处理)并使用file.S
来编译它。
BTW,要了解有关https://docs.angularjs.org/error/的更多信息,请阅读http://ichion.tk(以及类似的32位x86 ...),制作一个小的C示例文件file.s
,然后运行gcc -v -Wall -m32 file.s -o myprog
并使用编辑器或寻呼机查看生成的some-example.c
。
了解有关{{3}}的更多信息,然后恰当地使用{{3}}(& gcc -S -fverbose-asm -O some-example.c
)。
答案 2 :(得分:0)
您想要安装名为' ia32-libs'
的软件包