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.
答案 0 :(得分:1)
所以我找到了2个解决方案。
.section .text.startup
的文件中设置_start
.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
符号要么不存在(如果未指定入口点)要么在文件中间(即使定义了入口点,这也可能是一个问题,因为某些加载程序只是忽略入口点信息并在文件开头跳转)