【发布时间】:2020-07-14 03:36:03
【问题描述】:
我设置了一个项目,我在其中编译和链接共享库 (libexample.so) 与如下所示的链接器脚本:
SECTIONS
{
.modules : {
__MODULES_START = .;
KEEP(*(.mod*));
__MODULES_END = .;
}
...
}
我在我的代码中使用这些来加载编译到库中的模块。
extern uint32_t __MODULES_START;
extern uint32_t __MODULES_END;
unsigned int init_mods (void) {
void (*p)(void) = (void *)&__MODULES_START;
...
}
当我在 Makefile 中编译库时
build/%.o: %.c
gcc -o $@ -c $< -fPIC -g -Os -Iinclude
bin/libexample.so: $(OBJS)
gcc -o $@ $^ -shared -fPIC -lc -T$(LINKER_SCRIPT)
它可以很好地构建和链接,当我尝试将库链接到另一个调用“init_mods”的项目时它可以工作。
build/%.o: %.c
gcc -o $@ -c $< -fPIE -g -Os -Iinclude -I../libexample/include
bin/untitled-program: $(OBJS)
gcc -o $@ $^ -fPIE -lc -lexample -Lbin '-Wl,-rpath,$$ORIGIN'
但是,当我运行可以找到库的程序时,我收到以下链接错误:
/bin/untitled-program: error while loading shared libraries: /blah/blah/libexample.so: unexpected PLT reloc type 0x08
当我读取共享库时,我在符号表中得到了两个定义
Symbol table '.symtab' contains 223 entries:
Num: Value Size Type Bind Vis Ndx Name
...
154: 0000000000000050 0 NOTYPE GLOBAL DEFAULT 2 __MODULE_INIT_END
...
222: 0000000000000028 0 NOTYPE GLOBAL DEFAULT 2 __MODULE_INIT_START
所以我想知道我的问题是否与 NOTYPE 有关,但我在查找这方面的文档时遇到了麻烦。
为了解释为什么我认为我的问题与链接器脚本变量有关,当我在打开链接器调试的情况下运行程序时,其中一个是最后出现的。
$ LD_DEBUG=all ./untitled-program
...
23856: symbol=__MODULE_END; lookup in file=./bin/untitled-program [0]
23856: symbol=__MODULE_END; lookup in file=/usr/lib/libc.so.6 [0]
23856: symbol=__MODULE_END; lookup in file=./bin/libexample.so [0]
23856: binding file ./bin/libexample.so [0] to ./bin/libexample.so [0]: normal symbol `__MODULE_END'
...
23856: symbol=__MODULE_START; lookup in file=./bin/untitled-program [0]
23856: symbol=__MODULE_START; lookup in file=/usr/lib/libc.so.6 [0]
23856: symbol=__MODULE_START; lookup in file=./bin/libexample.so [0]
23856: binding file ./bin/libexample.so [0] to ./bin/libexample.so [0]: normal symbol `__MODULE_START'
./bin/untitled-program: error while loading shared libraries: ./bin/libexample.so: unexpected PLT reloc type 0x08
但是,这很奇怪,因为它能够在失败之前绑定其他链接器脚本变量之一。
我研究这个问题的时间太长了,所以我无法看到更大的图景。也许我在想这个错误,问题出在另一个符号上。任何帮助或指导将不胜感激!
【问题讨论】:
-
问题可能是由
libretroengine.so中的符号引用引起的,但您并没有描述您在那里所做的事情。 -
啊,感谢您了解这一点。这是我正在构建的库的实际名称,但我不想在问题中造成任何不必要的干扰