在windows上运行但不在linux上运行的Nasm代码
我试着汇编和链接我老师的NASM代码,但它在我的linux(Ubuntu 16.03)上无法运行,而在她的pc(Windows)上运行 这些是我组装代码所遵循的说明在windows上运行但不在linux上运行的Nasm代码,linux,gcc,assembly,nasm,ld,Linux,Gcc,Assembly,Nasm,Ld,我试着汇编和链接我老师的NASM代码,但它在我的linux(Ubuntu 16.03)上无法运行,而在她的pc(Windows)上运行 这些是我组装代码所遵循的说明 nasm -g -f elf32 test.asm;ld -m elf_i386 -s -o demo *.o ld返回一个错误 ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080 无论错误的影响如何,每次我运行命令时都会生成可
nasm -g -f elf32 test.asm;ld -m elf_i386 -s -o demo *.o
ld返回一个错误
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
无论错误的影响如何,每次我运行命令时都会生成可执行文件,但当我想在程序上使用gdb执行断点时,我无法执行。首先,代码需要对linux进行一些修补:
-global _main:
+global main
-_main:
+main:
从main
符号中删除下划线。另外,在global
指令中,不要添加冒号,这在指定新标签时是必需的
删除下划线也将应用于其他外部符号,如printf
,或将函数从asm发布到带有global
的C时
汇编:
nasm-g-felf32-Fdwarf test.asm;gcc-m32-o演示测试
您需要安装
nasm
、gcc
和32位库,不确定最小的软件包集是什么,但是通过sudo apt get install nasm gcc multilib
可能就足够了,即使是在*buntu的干净安装上。首先,代码需要对linux进行一些修补:
-global _main:
+global main
-_main:
+main:
从main
符号中删除下划线。另外,在global
指令中,不要添加冒号,这在指定新标签时是必需的
删除下划线也将应用于其他外部符号,如printf
,或将函数从asm发布到带有global
的C时
汇编:
nasm-g-felf32-Fdwarf test.asm;gcc-m32-o演示测试
您需要安装
nasm
、gcc
和32位库,但不确定最小的软件包集是什么,但是,即使在*buntu的干净安装上,使用sudo apt get install nasm gcc gcc multilib也可能足够了。最好的猜测是,您没有将此链接到使用C运行时代码作为入口点的可执行文件。您会收到一条警告,提示缺少\u start
入口点。入口点是\u main:
,以ret
结尾,因此看起来它应该链接到标准C库。您必须向ld
命令添加多个选项,以使此链接成为通用C应用程序,或者使用gcc进行链接,默认情况下将添加这些选项(如果链接器失败,可能还需要将\u main
更改为main
)gdb
即使在这种情况下也应该工作,您的问题是什么?只需使用file..
,b*0
(在执行时具有错误状态),run
,d1
(删除无效断点),您应该在(layout asm
,layout reg
中查看指令,stepi
)中获取一些调试信息,使用nasm-F dwarf…
可以获得断点的源代码和行号。nasm-g-Fdwarf-F elf32 test.asm;gcc-m32-o演示测试。o
将\u main
重命名为main
(您的老师使用的是Windows,该平台上的PE惯例是在外部标签上添加下划线)您需要执行sudo apt get install gcc multilib
您缺少i386 C运行时和i386 libgcc等。该命令应该安装它们。最好的猜测是您没有将其链接到使用C运行时代码作为入口点的可执行文件。您会收到一条警告,提示缺少\u start
入口点。入口点是\u main:
,以ret
结尾,因此看起来它应该链接到标准C库。您必须向ld
命令添加多个选项,以使此链接成为通用C应用程序,或者使用gcc进行链接,默认情况下将添加这些选项(如果链接器失败,可能还需要将\u main
更改为main
)gdb
即使在这种情况下也应该工作,您的问题是什么?只需使用file..
,b*0
(在执行时具有错误状态),run
,d1
(删除无效断点),您应该在(layout asm
,layout reg
中查看指令,stepi
)中获取一些调试信息,使用nasm-F dwarf…
可以获得断点的源代码和行号。nasm-g-Fdwarf-F elf32 test.asm;gcc-m32-o演示测试。o
将\u main
重命名为main
(您的老师使用的是Windows,该平台上的PE惯例是在外部标签上添加下划线)您需要执行sudo-apt-get-install-gcc-multilib
您缺少i386 C运行时和i386-libgcc等。该命令应该安装它们。由于gcc已安装(假定它已运行),因此需要执行的所有操作是gcc-multilib
(gcc的所有变体都需要binutils,而且由于他只是使用命令行构建要素,因此没有必要。似乎记得gcc mulitlib依赖于gcc,所以不认为它需要明确)gcc mulitlib依赖项列表确认了对gcc的依赖:因此,在干净的安装中,将首先安装所需的gcc依赖项(以及其他依赖项)当gcc multilib安装时,非常感谢@Ped7g和@Michael Petch。在安装gcc multilib
并从main中删除下划线后,它工作正常。我仍然遇到一个问题:当运行gdb
并执行break b100
时,它不会创建断点,但会返回函数“b100”未定义。使断点在将来的共享库加载时挂起?
@M.Iduoad是否使用_b100或b100?在代码中,它们上面有下划线,如果尚未删除,则还需要在gdb中使用下划线。我使用的是b100而不是_b100。现在可以使用了!非常感谢!因为已经安装了GCC(考虑到它运行)al