【发布时间】:2022-11-07 04:18:33
【问题描述】:
我有一个自定义 LLVM 编译器,它将全局变量 (glob_var) 放入数据部分。当我执行以下主程序程序:
#include <stdio.h>
extern unsigned char glob_var[];
int main() {
printf("%x\n", glob_var[0]);
return 0;
}
打印内容。现在我正在尝试编写一个静态库库文件访问此变量:
#include <stdio.h>
extern unsigned char glob_var[];
static void __attribute__((constructor)) ctor() {
printf("%x\n", glob_var[0]);
}
我正在编译:
clang -c -Wall -o lib.o lib.c
llvm-ar rc lib.a lib.o
clang -c -o main.o main.c
clang -o main.out -Wl,--whole-archive lib.a -Wl,--no-whole-archive main.o
我得到:
ld.lld: error: undefined symbol: glob_var
>>> referenced by lib.c
>>> lib.o:(ctor) in archive lib.a
最后一个命令。
请注意,glob_var 变量是在 main.c 编译期间创建的。当我反汇编 main.o 时,glob_var 在数据部分:
Disassembly of section .data:
0000000000000000 <glob_var>:
【问题讨论】:
-
clang -c -fPIE -Wall -o lib.o lib.c创建一个 object file,而不是 shared library。 -
也许clang做了一些技巧,但如果glob_var在所有文件中都声明为extern,那么这些文件中的任何一个都不应该定义它......我建议删除lib.c中的“extern”字样。
-
谁能知道您的自定义编译器是如何破坏事物的?发布一个每个人都可以复制的例子。
标签: c