_start 符号可能在哪里定义

Where is _start symbol likely to be defined

我有一些用于 RISCV 的启动程序集,它将 .text 部分定义为从 .globl _start 开始。

我知道这是什么 - 因为反汇编显示了地址,但我看不到它的定义位置。它不在链接器脚本中,构建目录中的 grep 显示它在各种二进制文件中,但我找不到定义。

我猜这作为体系结构的一个功能出现在某个文件中,但谁能告诉我在哪里? (这一切都是在 Linux 上使用 RISCV GNU 交叉编译器构建的)

所以_start只是定义在.text段的开头,而.text段的地址是在链接描述文件中定义的。

除非您自己控制它,否则在 gnu 工具世界中通常至少有一个名为 crt0.s 的文件。或者也许是其他名字。应该是每个体系结构一个,因为它是汇编语言。它是默认值 bootstrap,zeros .bss 根据需要复制 .data,等等

我不记得它是否是 C 库(glibc、newlib 等)的一部分,或者它是否是由构建针对特定平台的工具链的人后来添加的。

当然不是必需的,但看到 _start 是二进制文件开头的标签并不少见,它肯定是入口点。因此,如果您有一个使用带有标签(elf 等)的二进制文件的操作 system/loader,那么它可以加载二进制文件,而不是分支到第一个地址,而是分支到入口点。