linux - 加载警告 : cannot find entry symbol _start

标签 linux assembly warnings nasm ld

我正在学习汇编编程。下面是打印“Hello, World!”的简单程序。当程序完美运行时,我收到警告消息,而 loading

ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080



这是代码:
section .data
    msg db 'Hello, world!', 0xa
    len equ $ - msg

section .text
    global main

main:

    mov ebx, 1
    mov ecx, msg
    mov edx, len
    mov eax, 4
    int 0x80

    mov eax, 1
    int 0x80

任何人都可以解释这个警告的含义。我正在使用 nasmubuntu 14 .

最佳答案

使用标签 _start而不是 main用于 ELF 入口点。 main暗示它就像 C main函数,但这甚至不是函数(例如 you can't ret )。

您没有说,但是从错误消息和代码中,我假设您正在使用 nasm -felf32 hello32.asm && ld -melf_i386 -o hello32 hello32.o 构建 32 位代码
(如果您实际上正在构建 64 位代码,那么您很幸运它恰好可以工作,但是一旦您使用 esp 而不是 rsp 进行任何操作,它就会中断。)
错误信息来自 ld ,而不是来自 nasm .它在消息中说得对。蒂姆的评论是正确的:ld寻找 _start符号在它链接的文件中,但如果找不到,则将入口点设置为文本段的开头。
您定义的其他全局/外部符号无关紧要。 main在这里根本没有相关性,并且可以指向您想要的任何地方。它只对反汇编输出和类似的东西有用。如果您取出 global main,您的代码将完全相同。/main:行,或将它们更改为任何其他名称。

将其标记为 main是不明智的,因为 ELF 入口点不是函数 .这不是 main() ,并且没有收到 argcargv参数,并且不能 ret因为 ESP 指向 argc而不是返回地址。

仅使用 main如果你链接 gcc/glibc 的 CRT 启动代码,它会寻找 main符号并在初始化 libc 后调用它。 (所以像 printf 这样的函数可以工作。技术上动态的链接器钩子(Hook)让 libc 在你的 _start 之前自行初始化,如果你链接了它,但通常不要这样做,除非你完全理解你在做什么)。相关:Assembling 32-bit binaries on a 64-bit system (GNU toolchain)
例如 gcc -m32 -no-pie -o hello main.o 如果您确实定义了 main:而不是 gcc -m32 -static -nostdlib -o hello start.o(相当于你的裸 ld )。
(在过去的几年里,Linux 发行版有 configured GCC with -pie as the default ,它需要与位置无关的代码。但是在没有 RIP 相对寻址的 32 位模式下,这真的很不方便(例如,查看 GCC asm 输出),这意味着 ld不会为您将 call printf 转换为 call printf@plt。因此,对于大多数遵循大多数教程的手写 asm,您需要传统的非 PIE 可执行文件,因此不需要文本重定位。)

关于linux - 加载警告 : cannot find entry symbol _start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34758769/

相关文章:

linux - 程序从终端运行良好,但不能从 shell 脚本运行

c - 将程序集 'shl' 、 'OR' 、 'AND' 、 'SHR' 操作转换为 C 的引用?

c++ - 如何从非空函数返回?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

jquery - 如何在 jQuery 下拉菜单中附加一组元素符号?

python - 如何将 eps 文件转换为 png 文件并保持名称?

linux - openssl输出文件权限

linux - 一个支持压缩、加密、保留权限和快速检索文件的归档器

linux - 洞察调试器断点不起作用

c - 在 GCC 中切换 Intel 和 ATT 模式