Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在现代64位Linux中将C函数库链接到x86汇编程序_C_Linux_Assembly_Gnu - Fatal编程技术网

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

在现代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

我正在阅读一本关于x86编程专业汇编语言的书,WROX2005。昨晚我遇到了一些问题,我希望在今天回家之前解决这些问题,这样我就可以开始跑步并继续阅读课文。如果我没有弄错的话,我的机器运行的是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位汇编程序动态链接的帮助。

听起来您需要安装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是完成这项工作的最佳方式。不是很优雅,但很管用。