是否可以 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

问题:

  1. 是否可以将其他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

这是可行的,因为共享库(默认情况下)允许具有未解析的符号。