在windows上运行但不在linux上运行的Nasm代码

在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代码,但它在我的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

无论错误的影响如何,每次我运行命令时都会生成可执行文件,但当我想在程序上使用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