【发布时间】:2021-06-17 17:00:05
【问题描述】:
在阅读《操作系统从 0 到 1》一书时,我目前正在尝试在裸机上构建一个可调试的程序。
我正在编译以下程序:
void main() {}
使用gcc -ffreestanding -nostdlib -gdwarf-4 -m32 -ggdb3 -c os.c -o os.o 没有错误。
但是在输出上运行ld -m elf_i386 -nmagic -T os.ld os.o -o os.o 时,
os.ld 是:
ENTRY(main);
PHDRS
{
headers PT_PHDR PHDRS;
code PT_LOAD FILEHDR PHDRS;
}
SECTIONS
{
.text 0x600: ALIGN(0x100) { *(.text) } :code
.data : { *(.data) }
.bss : { *(.bss) }
/DISCARD/ : { *(.eh_frame) }
}
它会抛出以下错误:
ld: warning: cannot find entry symbol main; not setting start address
尽管根据 readelf os.o 包含符号“main”。
readelf -s os.o的输出:
Symbol table '.symtab' contains 23 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS os.c
2: 00000000 0 SECTION LOCAL DEFAULT 3
3: 00000000 0 SECTION LOCAL DEFAULT 5
4: 00000000 0 SECTION LOCAL DEFAULT 6
5: 00000000 0 SECTION LOCAL DEFAULT 7
6: 00000000 0 SECTION LOCAL DEFAULT 8
7: 00000000 0 SECTION LOCAL DEFAULT 10
8: 00000000 0 SECTION LOCAL DEFAULT 11
9: 00000000 0 SECTION LOCAL DEFAULT 13
10: 00000000 0 SECTION LOCAL DEFAULT 17
11: 00000000 0 SECTION LOCAL DEFAULT 19
12: 00000000 0 SECTION LOCAL DEFAULT 21
13: 00000000 0 SECTION LOCAL DEFAULT 22
14: 00000000 0 SECTION LOCAL DEFAULT 15
15: 00000000 0 SECTION LOCAL DEFAULT 23
16: 00000000 0 NOTYPE LOCAL DEFAULT 2 wm4.0.5fa2ff0e40930321219
17: 00000000 0 SECTION LOCAL DEFAULT 20
18: 00000000 0 SECTION LOCAL DEFAULT 1
19: 00000000 0 SECTION LOCAL DEFAULT 2
20: 00000000 20 FUNC GLOBAL DEFAULT 3 main
21: 00000000 0 FUNC GLOBAL HIDDEN 7 __x86.get_pc_thunk.ax
22: 00000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_
知道可能是什么问题吗?
【问题讨论】:
标签: c linker operating-system ld bare-metal