【问题标题】:ld: warning: cannot find entry symbol main; not setting start addressld:警告:找不到入口符号 main;未设置起始地址
【发布时间】: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


    【解决方案1】:

    你正在破坏你的os.o(输入与输出相同)

    变化:

    ld -m elf_i386 -nmagic -T os.ld os.o -o os.o
    

    进入:

    ld -m elf_i386 -nmagic -T os.ld os.o -o osx
    

    谢谢,解决了。我试图故意覆盖它。你能解释一下为什么会导致这个错误吗? – 菲利克斯 B.

    ld [以及大多数此类构建命令]不允许允许将输入文件指定为输出文件。

    ld 在写入-o osx 输出文件时可能需要多次读取os.o

    简单的构造是我们在程序启动时打开一个文件供读取和一个输出文件供写入。

    对于您想要的,程序必须检测到 infile 和 outfile 是否相同并创建 infile 的临时副本。

    在一般情况下很难保证。它很少使用并且会减慢速度。

    另外,如果您将命令放在 makefile 中:

    all: osx
    
    os.o: os.c
        gcc -ffreestanding -nostdlib -gdwarf-4 -m32 -ggdb3 -c os.c -o os.o
    
    osx: os.o os.ld
        ld -m elf_i386 -nmagic -T os.ld os.o -o osx
    

    如果ld 产生错误,make 将删除osx 文件。

    考虑到如果os.o 是输出文件,这会弄乱make 所依赖的依赖关系。

    【讨论】:

    • 谢谢,解决了。我试图故意覆盖它。你能解释一下为什么会导致这个错误吗?
    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2022-11-11
    • 2012-10-25
    • 2013-06-08
    • 1970-01-01
    • 2013-03-02
    • 2017-12-29
    • 2012-11-10
    相关资源
    最近更新 更多