gpt4 book ai didi

c - 对象链接顺序问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:48:57 25 4
gpt4 key购买 nike

我遇到链接问题。我会举例说明:

交流电:

extern void b(void);
int main() {
a();
return 0;
}

void a() {
b();
}

b.S:

.extern a
b:
jmp a

不管我会不会链接

gcc a.o b.o -o c

gcc b.o a.o -o c

我会得到未解析的符号。如何链接这些文件?我无法合并它们。示例可能毫无意义,但这说明了要点,即我要尝试归档什么。

最佳答案

初步调查:

交流

extern void b(void);
void a(void);

int main() {
a();
return 0;
}

void a() {
b();
}

b.S

.extern a
b:
jmp a

BC

void a(void);

void b(void)
{
a();
}

输出

$ gcc -c a.c
$ gcc -c b.c -o b_gcc.o
$ as b.S -o b_as.o
$ gcc a.o b_gcc.o -o test_gcc
$ gcc a.o b_as.o -o test_as
a.o: In function `a':
a.c:(.text+0x15): undefined reference to `b'
collect2: error: ld returned 1 exit status

那么是什么给了?为什么 GCC 可以,但 GAS 不行?

$ objdump -t b_gcc.o > syms_gcc
$ objdump -t b_as.o > syms_as
$ diff syms_gcc syms_as
2c2
< b_gcc.o: file format elf64-x86-64
---
> b_as.o: file format elf64-x86-64
5d4
< 0000000000000000 l df *ABS* 0000000000000000 b.c
9,12c8
< 0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
< 0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
< 0000000000000000 l d .comment 0000000000000000 .comment
< 0000000000000000 g F .text 000000000000000b b
---
> 0000000000000000 l .text 0000000000000000 b

好的,所以 gcc 使 b 成为全局符号。让我们在 b.S 中尝试 .global b:

$ as b.S -o b_as2.o
$ gcc a.o b_as2.o
$

成功。因此 gcc/ld 对不在静态库中的任何内容进行多 channel 符号解析。但它 查找全局符号。这是最后的 b.S:

.extern a
.global b
b:
jmp a

关于c - 对象链接顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com