如何在64位Ubuntu上安装32位glibc

7
我正在尝试学习汇编语言中的C调用约定。为此,我使用了C标准库中的puts函数制作了一个简单的程序。
我使用以下命令进行汇编和链接: nasm -f elf file.asm gcc -m32 file.asm -o file nasm生成了正确的目标文件,但在运行gcc链接对象文件时出现错误。从错误信息来看,我发现我没有32位版本的glibc。我应该如何安装它?我已经安装了这个软件包。
我使用64位ubuntu 12.04作为我的操作系统。
编辑:我已经安装了下列软件包,但问题仍未解决:
1)ia32-libs 2)libc6-i386

1
如果您需要帮助解决任何错误,发布“错误消息的确切文本”总是有意义的。 - davmac
3个回答

23

这个命令将在64位Ubuntu上安装32位的glibc库:

sudo apt-get install gcc-multilib

使用gcc将汇编目标代码链接到可执行文件的正确语法如下:

gcc -m32 objectfile.o -o executablefile

(nasm -felf32已经创建了objectfile.o; 在GCC的命令行中不需要出现.asm文件。GCC可以使用GAS语法一步汇编和链接.S文件,但NASM是一个单独的软件包.)


@BasileStarynkevitch 那么必须有一个解释。仅发布代码并不教授任何知识。 - Leb
1
感谢您的反馈。我对我的回答进行了一些详细说明。我只是想分享我用来获取32位glibc库的命令。 - brennanhm
这帮助我在x64上使用debien交叉编译ARM,使用来自2015q2的arm-none-eabi-gcc。 - Gauthier

2
我用以下命令组装和链接了程序: nasm -f elf file.asm gcc -m32 file.o -o file 这是错误的。你的第一个nasm命令可能创建了一个file.o文件(你可以用ls -l file.o检查一下)。第二个gcc命令并不会达到你想要的效果。
但是gcc不知道如何处理*.asm文件扩展名(它知道可预处理的GNU汇编器语法的.S和汇编代码的.s,但可能默认将未知扩展名如.asm视为ELF目标文件,然而file.asm不是一个ELF目标文件)。你应该尝试使用以下命令进行链接:
gcc -Wall -v -m32 file.o -o file

注意,你需要向GCC提供一个目标文件,它使用ELF格式(对于被gcc 调用的链接器),该文件是先前使用nasm生成的。

(之后可能会删除-v选项以供gcc使用)

或者,使用GNU as汇编语法(而不是nasm),将文件命名为file.S(如果要预处理)或file.s(不预处理),并使用gcc -v -Wall -m32 file.s -o myprog进行编译。

顺便提一下,如果想更好地了解调用约定,可以阅读x86-64 ABI规范(以及类似的32位x86规范),编写一个小的C示例文件some-example.c,然后运行gcc -S -fverbose-asm -O some-example.c并使用编辑器或分页器查看生成的some-example.s
还要学习更多关于ELF的知识,然后适当使用readelfobjdump

1

你想安装一个叫做'ia32-libs'的软件包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接