2

我正在编写自己的操作系统(静态地址),并且我很难让链接器始终将我的_start函数放在进程中我想要的位置。我在我的构建文件中指定了位置-Ttext 0x10000(在这个例子中我们只说 0x10000)。

通常这是可行的,但是当我使用-O2链接器时,会将我的main函数放在这个地址上。

那么我怎样才能确保它_start最终出现在这个地址上呢?是否可以不编写链接器脚本?

该函数_start对所有进程都是通用的,并且在程序返回而不是调用exit(). 我脑子里有一个解决方案,但我更愿意用链接器来代替它。

4

2 回答 2

2

所以我找到了2个解决方案。

  1. .section .text.startup在包含的文件中设置_start
  2. .section .text.mustbefirst在包含的文件中设置(我自己的部分名称)_start

在第一个变体中,我只是确保启动代码也包含在与包含 main 的代码相同的顺序中,尽管在我的情况下确实存在一些歧义。

在第二个变体中,我修改了默认链接器脚本以确保我的节符号是第一个。

如果第一个是可靠的(例如,取决于参数的顺序或其他东西),那么这没关系。作为旁白; 有人知道吗?如果没有,那么我会推荐一个新的节符号和修改后的链接器脚本。

于 2019-03-20T10:43:35.180 回答
-2

将此添加到您的链接器脚本文件中(例如,如果您的启动文件crt0.o包含_start

STARTUP(crt0.o)

(可在https://wiki.osdev.org/Linker_Scripts#STARTUP找到)

现在(对我来说是powerpc)文件开头的反汇编产生:

main.elf:     file format elf32-powerpc

Disassembly of section .text:

01800154 <_start>:
 1800154:       94 21 ff e0     stwu    r1,-32(r1)
 1800158:       7c 08 02 a6     mflr    r0
 180015c:       93 61 00 0c     stw     r27,12(r1)
 1800160:       93 81 00 10     stw     r28,16(r1)

否则,该_start符号要么不存在(如果未指定入口点),要么位于文件中间(即使定义了入口点,这也可能是一个问题,因为某些加载程序只是忽略入口点信息并在开头跳转文件)

于 2021-02-17T14:55:34.137 回答