【问题标题】:Can I dynamically link libraries that have duplicated name of functions?我可以动态链接具有重复函数名称的库吗?
【发布时间】:2018-10-11 07:09:37
【问题描述】:

想象 Library1.soLibrary2.so 有:

func1(), func2(), glob_data1, glob_data2  


情况:
我想在 Library1 中使用 func1()glob_data1
并同时在 Library2 中使用 func2()glob_data2


问题:
当我动态链接这些库时,我该怎么做?
(如果在 C 级别没有办法,在汇编级别有没有可能的方法?)

【问题讨论】:

  • 你在为什么操作系统编程?
  • @fuz 哦,我错过了,我用的是 Linux。

标签: assembly compilation linker dynamic-linking


【解决方案1】:

想象一下 Library1.soLibrary2.so 有:func1(), func2(), glob_data1, glob_data2

将这两个库加载到 Linux(和其他 UNIX 系统)上的单个进程中通常是一个非常糟糕的主意

例如当func1library1 调用func2func2 被调用?答案取决于库的链接方式、加载方式以及顺序。

如果函数不调用任何其他导出符号,您可以通过从dlopendlsym 获得的函数指针调用它们:

void *h1 = dlopen("Library1.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L1)(void) = dlsym(h1, "func1");

void *h2 = dlopen("Library2.so", RTLD_LOCAL|RTLD_LAZY);
int (*f1L2)(void) = dlsym(h2, "func1");

printf("func1 from Library1 returns %d\n", f1L1());
printf("func1 from Library2 returns %d\n", f1L2());

【讨论】:

  • 希望库对导出的函数使用 hidden 别名,因此库中的内部调用不会通过 PLT/符号插入机制。 (因此效率更高)。但是,是的,有些没有。
【解决方案2】:

如果这些符号不打算在库之外使用,您可以简单地将它们标记为 __attribute((visibility("hidden")))(或者最好使用 -fvisibility=hidden 编译您的代码并使用 __attribute((visibility("default"))) 注释公共函数)。

如果这些函数必须保持公开,您可以使用-symbolic 标志链接您的库。这将导致链接器尽可能解析对本地定义(而不是 PLT 存根)的引用。

请注意,-symbolic 适用于 所有 库符号。使用符号别名可以为符号子集实现相同的效果,但这涉及更多,因此除非您确实需要,否则我宁愿不详细介绍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2021-11-26
    • 2020-04-11
    • 2011-04-04
    相关资源
    最近更新 更多