在现代64位Linux中将C函数库链接到x86汇编程序

时间:2011-10-31 13:03:54

标签: c linux assembly gnu

我正在阅读一本专注于x86编程的书(Professional Assembly Language,WROX 2005)。昨晚我遇到了一些问题,我希望在今天回家之前解决这个问题,这样我就可以开始运行并继续发送文本。我的机器运行x64 Ubuntu(11.04,如果我没有记错的话)所以专注于32位x86的文字略显“过时”(我必须在组装时添加--32)。

我正在尝试动态地将C库函数与我的汇编程序链接,但我不完整(下面的命令来自内存)。

ld -dynamic-linking /lib/ld-linux.so.2 -o complex -lc complex.o -m elf_i386

在Linux中运行上面的命令给我的消息是它无法理解-lc。好的,我把它删除了。

ld -dynamic-linking /lib/ld-linux.so.2 -o complex complex.o -m elf_i386

然后我收到'printf'无法识别的通知。希望动态链接器链接到库,但它似乎没有这样做。去\ lib \我找不到ld-linux.so.2(奇怪的是它没有给我一个错误)但我确实找到了ld-linux-86-64.so.2。我的代码是32位,但我想到了什么,让我们试试这个:

ld -dynamic-linking /lib/ld-linux-86-64.so.2 -o complex complex.o -m elf_i386

它仍然给出了'call printf'无法识别的相同错误。

需要帮助使用64位Linux和标准GNU工具将C库函数与我的32位汇编程序动态链接。

3 个答案:

答案 0 :(得分:3)

听起来你需要安装32位C运行时。在Fedora下,这是:

yum install glibc-devel.i686

但我不知道等效Ubunutu包的名称;也许:

apt-get install libc6-dev-i386

答案 1 :(得分:2)

尝试自己构建ld命令行几乎总是一个坏主意。让海湾合作委员会为你做;它会自动处理您不必担心的各种细微之处。对于32位程序,您需要一个特殊的命令行开关-m32

gcc -m32 -o complex complex.o

如果您有更多.o个文件,请在最后堆叠它们。如果您需要链接任何系统库其他而不是libc,请在所有目标文件之后添加适当的-lwhatever选项

特洛伊福也是正确的; 32位工具链是一个可选组件。但是您需要的不仅仅是32位C库。先试试这个:

apt-get install gcc-multilib

它应该吸引你需要的大部分内容。

答案 2 :(得分:0)

请尝试以下顺序(假设您的代码为try.s):

as  --32 -g -o try.o   try.s
ld -m elf_i386  -dynamic-linker /lib/ld-linux.so.2 -lc  -o try try.o

对于x86-64格式的可执行文件:

as   -g -o try.o   try.s
ld  -dynamic-linker  /lib64/ld-linux-x86-64.so.2 -lc  -o try try.o