是否可以 link 针对 executable 文件中的 .symtab table 符号?
Is it possible to link against .symtab table symbols in an executable file?
下面给出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
问题:
- 是否可以将其他relocatable(目标文件或静态库)或共享库或executable转use/linkagainst/access转[=39= .symtab table 中的 ]test 符号?
注意:感谢您审阅问题,此问题仅用于教育目的,我没有遇到真正的问题。
编辑:
要在 executable 动态 table:
中导出 test 符号
clang-10 main.c -Wl,--dynamic-list=symbols.txt -fPIC -o main
symbols.txt:
{
test;
};
test 符号出现在 .dymsym table.
根据上面的 executable main:
从下面的源文件 (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.
Is it possible
没有
for other relocatable (object file or static library)
这部分问题没有意义:link .o
file against .symtab
to produce what?
如果你的意思是,link 一个额外的 foo.o
到现有的 executable,答案是否定的:ELF
linker 考虑 executable 最终。重建 executable 所需的大部分信息在 link 之后被丢弃,如果没有这些信息,将 executable 分开并用添加的新代码再次重建它几乎是不可能的。
有一个 linker(在 AIX 上)允许这样的拆分和重建,但它不使用 ELF
格式。
or shared lib
否:动态 linker 不能使用 .symtab
。它是动态交易品种table.
中要导出的交易品种
你可以用-Wl,--export-dynamic
标志构建你的executable,然后该函数将出现在.dynsym
中并可供其他人使用共享库。
or executable to use/link against/access to the test symbol in .symtab table?
一个 executable link 对抗另一个 executable 意味着什么?
它们不能在同一个进程中都是运行(除非其中一个是位置无关的executable,这实际上是共享库的一种特殊形式)。
更新:
clang-10 shared.c main -fPIC -shared -o libShared.so
就像我之前说的,你不要 link反对main
executable。
您要查找的命令是:
clang-10 shared.c -fPIC -shared -o libShared.so
这是可行的,因为共享库(默认情况下)允许具有未解析的符号。
下面给出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
问题:
- 是否可以将其他relocatable(目标文件或静态库)或共享库或executable转use/linkagainst/access转[=39= .symtab table 中的 ]test 符号?
注意:感谢您审阅问题,此问题仅用于教育目的,我没有遇到真正的问题。
编辑: 要在 executable 动态 table:
中导出 test 符号clang-10 main.c -Wl,--dynamic-list=symbols.txt -fPIC -o main
symbols.txt:
{
test;
};
test 符号出现在 .dymsym table.
根据上面的 executable main:
从下面的源文件 (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.
Is it possible
没有
for other relocatable (object file or static library)
这部分问题没有意义:link .o
file against .symtab
to produce what?
如果你的意思是,link 一个额外的 foo.o
到现有的 executable,答案是否定的:ELF
linker 考虑 executable 最终。重建 executable 所需的大部分信息在 link 之后被丢弃,如果没有这些信息,将 executable 分开并用添加的新代码再次重建它几乎是不可能的。
有一个 linker(在 AIX 上)允许这样的拆分和重建,但它不使用 ELF
格式。
or shared lib
否:动态 linker 不能使用 .symtab
。它是动态交易品种table.
你可以用-Wl,--export-dynamic
标志构建你的executable,然后该函数将出现在.dynsym
中并可供其他人使用共享库。
or executable to use/link against/access to the test symbol in .symtab table?
一个 executable link 对抗另一个 executable 意味着什么? 它们不能在同一个进程中都是运行(除非其中一个是位置无关的executable,这实际上是共享库的一种特殊形式)。
更新:
clang-10 shared.c main -fPIC -shared -o libShared.so
就像我之前说的,你不要 link反对main
executable。
您要查找的命令是:
clang-10 shared.c -fPIC -shared -o libShared.so
这是可行的,因为共享库(默认情况下)允许具有未解析的符号。