给出以下main.c.文件。
#include <stdio.h>
void test()
{
printf("test()\n");
}
int main() {
test();
return 0;
}
执行下面的命令
clang-10 main.c -o main
readelf -s main
嵌入的输出复制在这里。
Symbol table '.dynsym' contains 4 entries:
... ignore ...
Symbol table '.symtab' contains 62 entries:
Num: Value Size Type Bind Vis Ndx Name
61: 00000000004004f0 23 FUNC GLOBAL DEFAULT 13 test
问题:是否可以在其他可重定位的文件(对象文件)中链接到.symtab表符号?
注:感谢您的审题,本题只是为了教育,我没有遇到真正的问题。
编辑 : 要导出 检验 符号在可执行动态表中。
clang-10 main.c -Wl,--dynamic-list=symbols.txt -fPIC -o main
symbols.txt:
{
test;
};
符号: 检验 符号显示在.dymsym表中。
从下面的源文件(shared.c)建立另一个依赖于上述可执行文件的共享库 主:
extern void test();
void share() {
test();
}
构建命令。
clang-10 shared.c main -fPIC -shared -o libShared.so
然而,构建失败,并给出以下错误信息。
main: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
main: In function `data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/crtbeginS.o:(.data.rel.local+0x0): first defined here
main: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/crtendS.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
main:(.data+0x10): first defined here
/usr/bin/ld: error in main(.eh_frame); no .eh_frame_hdr table will be created.
是否可以
编号
对于其他可重定位(对象文件或静态库)。
这部分问题没有意义:链接 .o
诉诸 .symtab
生产 什么?
如果你的意思是,链接一个额外的 foo.o
到现有的可执行文件中,答案是否定的。ELF
链接器认为可执行文件 最后的. 重建可执行文件所需的大部分信息在链接后都被丢弃了,如果没有这些信息,将可执行文件拆开并添加新的代码再次重建几乎是不可能的。
有一个链接器(在AIX上)允许这样的拆分和重建,但它没有使用 ELF
格式。
或共享lib
否:动态链接器不能使用 .symtab
. 它是动态符号表中要导出的符号。
您 可以 构建你的可执行文件 -Wl,--export-dynamic
标志,然后该函数将出现在 .dynsym
并可由其他共享库使用。
或可执行文件与.symtab表中的测试符号的访问链接?
一个可执行文件与另一个可执行文件的链接是什么意思?它们不能同时在同一个进程中运行(除非其中一个是位置无关的可执行文件,这实际上是一种特殊形式的共享库)。
更新。
clang-10 shared.c main -fPIC -shared -o libShared.so
就像我之前说的,你 不要 挂靠 main
可执行文件。
你要找的命令是。
clang-10 shared.c -fPIC -shared -o libShared.so
这样做的原因是共享库(默认情况下)允许有未解析的符号。