How can i get LD to put always put the entry point at the location of -Ttext?

时间:2019-03-19 14:39:26

标签: gcc linker osdev linker-scripts linker-flags

I'm writing my own operating system (static addresses) and I struggle to get the linker to always put my _start function at my desired location within the processes. I specify the location with -Ttext 0x10000 in my build file (Lets just say 0x10000 for this example).

Normally this works, but when i use -O2 the linker puts my main function on this address instead.

So how can i make sure that it is _start that ends up on this address? And is it possible without writing linker scripts?

The function _start is common for all processes and should enforce a nice exit for the scheduler in cases where the program returns instead of calling the exit(). I have a workaround solution in my head but I would preferred to get this working with the linker instead.

2 个答案:

答案 0 :(得分:1)

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

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

在第一个变体中,我只是确保以与包含main的代码相同的顺序包含了起始代码,尽管在我的情况下确实有些歧义。

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

如果第一个是可靠的(例如,取决于参数的顺序或其他内容),则可以。作为旁白;有人知道吗如果没有,那么我会推荐一个新的部分符号和修改后的链接描述文件。

答案 1 :(得分:-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 符号要么不存在(如果未指定入口点)要么在文件中间(即使定义了入口点,这也可能是一个问题,因为某些加载程序只是忽略入口点信息并在文件开头跳转)