小编ows*_*wst的帖子

添加函数调用如何导致其他符号在链接时变为未定义?

我希望有人能够帮助解决我认为是链接器脚本问题的问题.

在添加对新函数的调用后,我遇到了一个奇怪的问题.没有函数调用,我的目标文件链接正确,但是,添加了新的函数调用,我得到一个未定义的引用来自另一个目标文件的符号(我已经验证它实际上是使用objdump存在).

同样奇怪的是,在函数调用存在的情况下,如果我首先使用ld -r链接所有目标文件(以提供可重定位的输出)然后使用我的链接脚本,则没有未定义的引用,但似乎链接脚本被忽略,因为输出二进制文件没有正确的入口点.

我的(交叉编译器)ld版本:

> i586-elf-ld --version
GNU ld(GNU Binutils)2.20.1.20100303

我试图证明存在"缺失"符号:

> i586-elf-ld -T link.ld -o kernel32.bin kernel_loader.o main.o stdio.o common.o gdt.o gdt.bin -y putch

main.o: reference to putch  
stdio.o: definition of putch  
main.o: In function `main':  
main.c:(.text+0x1f): undefined reference to `putch'
Run Code Online (Sandbox Code Playgroud)

NB(当我生成此输出时,我使用gdt.bin的文件名作为nasm编译的汇编程序,它只是另一个.o文件,真的)

我可以在相应的目标文件中看到"缺失"的符号:

> i586-elf-objdump -ht stdio.o
stdio.o:文件格式elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000002f9  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         0000000c  00000000  00000000  00000330  2**2
                  CONTENTS, …
Run Code Online (Sandbox Code Playgroud)

c assembly linker compilation binutils

25
推荐指数
1
解决办法
1759
查看次数

标签 统计

assembly ×1

binutils ×1

c ×1

compilation ×1

linker ×1