我正在阅读一本专注于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位汇编程序动态链接。
答案 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
选项。
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