在现代64位Linux中将C函数库链接到x86汇编程序
我正在阅读一本关于x86编程专业汇编语言的书,WROX2005。昨晚我遇到了一些问题,我希望在今天回家之前解决这些问题,这样我就可以开始跑步并继续阅读课文。如果我没有弄错的话,我的机器运行的是x64 Ubuntu 11.04,所以在32位x86上的文本有点“过时”,我必须在组装时添加-32 我正在尝试将C库函数与我的汇编程序动态链接,但没有成功。下面的所有命令都来自内存在现代64位Linux中将C函数库链接到x86汇编程序,c,linux,assembly,gnu,C,Linux,Assembly,Gnu,我正在阅读一本关于x86编程专业汇编语言的书,WROX2005。昨晚我遇到了一些问题,我希望在今天回家之前解决这些问题,这样我就可以开始跑步并继续阅读课文。如果我没有弄错的话,我的机器运行的是x64 Ubuntu 11.04,所以在32位x86上的文本有点“过时”,我必须在组装时添加-32 我正在尝试将C库函数与我的汇编程序动态链接,但没有成功。下面的所有命令都来自内存 ld -dynamic-linking /lib/ld-linux.so.2 -o complex -lc complex.o
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位汇编程序动态链接的帮助。听起来您需要安装32位C运行时。在Fedora下,这是:
yum install glibc-devel.i686
但我不知道同等的Ubunutu软件包的名称;也许:
apt-get install libc6-dev-i386
听起来您需要安装32位C运行时。在Fedora下,这是:
yum install glibc-devel.i686
但我不知道同等的Ubunutu软件包的名称;也许:
apt-get install libc6-dev-i386
尝试自己构造ld命令行几乎总是一个坏主意。让GCC为你做这件事;它会自动处理你不想担心的各种微妙问题。对于32位程序,您确实需要一个特殊的命令行开关,-m32: 如果你有更多的.o文件,就把它们堆在最后。如果需要链接libc以外的任何系统库,请在所有对象文件之后放置适当的-lwhatever选项 特洛伊敌人也是正确的;32位工具链是可选组件。但您需要的不仅仅是32位C库。先试试这个:
apt-get install gcc-multilib
它应该能提供您所需的大部分功能。尝试自己构建ld命令行几乎总是一个坏主意。让GCC为你做这件事;它会自动处理你不想担心的各种微妙问题。对于32位程序,您确实需要一个特殊的命令行开关,-m32: 如果你有更多的.o文件,就把它们堆在最后。如果需要链接libc以外的任何系统库,请在所有对象文件之后放置适当的-lwhatever选项 特洛伊敌人也是正确的;32位工具链是可选组件。但您需要的不仅仅是32位C库。先试试这个:
apt-get install gcc-multilib
它应该能提供您所需的大部分功能。请按以下顺序尝试提供您的代码文件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
请按以下顺序重试。请将您的代码文件设置为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
成功了。ld linker.so.2出现在/lib下。工作命令是:ld-dynamiclinker/lib/ld linker.so.2-lc-o complex.o-melf_i386完成了这个任务。ld linker.so.2出现在/lib下。工作命令是:ld-dynamiclinker/lib/ld linker.so.2-lc-o complex.o-melf_i386感谢您的支持。运行此命令是为了防止其他领域出现类似的挑战。我不得不使用-lc使linker命令工作,但我不知道为什么。ld没有'32',因为模拟选项汇编程序与-32有点类似,所以使用了elf_i386。你提到的所有事情都是你不想担心的微妙之处,还有一些你还没有被绊倒,但很快就会被绊倒。认真地说,使用编译器驱动程序链接。我不能帮你组装,除非你真的在用气体,但似乎没有人喜欢它,我不知道为什么。它确实有效_start必须与main交换,但它可以工作。gcc-m32-o complexmain complexmain.sgcc是完成这项工作的最佳方式。不是很优雅,但很管用。谢谢你。运行此命令是为了防止其他领域出现类似的挑战。我不得不使用-lc使linker命令工作,但我不知道为什么。ld没有'32',因为模拟选项汇编程序与-32有点类似,所以使用了elf_i386。你提到的所有事情都是你不想担心的微妙之处,还有一些你还没有被绊倒,但很快就会被绊倒。认真地说,使用编译器驱动程序链接。我不能帮你组装,除非你真的在用气体,但似乎没有人喜欢它,我不知道为什么。它确实有效_start必须与main交换,但它可以工作。gcc-m32-o complexmain complexmain.sgcc是完成这项工作的最佳方式。不是很优雅,但很管用。