是否可以在可执行文件中链接.symtab表符号?

问题描述 投票:0回答:1

给出以下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表符号?

  1. 是否可以让其他可重定位的文件(对象文件或静态库)或共享库或可执行文件使用elink反对访问 检验 .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.
c linker elf
1个回答
0
投票

是否可以

编号

对于其他可重定位(对象文件或静态库)。

这部分问题没有意义:链接 .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

这样做的原因是共享库(默认情况下)允许有未解析的符号。

© www.soinside.com 2019 - 2024. All rights reserved.