gpt4 book ai didi

c - -rdynamic 仅用于选择符号?

转载 作者:IT王子 更新时间:2023-10-29 00:38:56 26 4
gpt4 key购买 nike

场景:

可执行文件在运行时通过 dlopen 加载共享对象。

共享对象引用了一些实际编译到主可执行文件中的符号(函数)。

如果我在链接可执行文件时将 -rdynamic 添加到 gcc,则效果很好。

-rdynamic 导出可执行文件的所有非静态符号。我的共享对象只需要选定的几个。

问题:有没有办法实现-rdynamic 的效果,但限制了我知道我的共享对象需要的几个选择符号?

编辑:

至少有两个人误解了这个问题,所以我试着澄清一下:

这个问题是关于从主可执行文件中导出一个符号。

这个问题不是关于从动态库导出符号。

这是一个最小的例子:

func.h,公共(public)头文件

#include <stdio.h>
void func(void);

main.c,主要可执行代码:

#include <dlfcn.h>
#include "func.h"

// this function is later called by plugin
void func(void) {
printf("func\n");
}

int main() {
void * plugin_lib = dlopen("./plugin.so", RTLD_NOW);
printf("dlopen -> %p, error: %s\n", plugin_lib, dlerror());

// find and call function "plugin" in plugin.so
void (*p)(void); // declares p as pointer to function
p = dlsym(plugin_lib, "plugin");
p();

return 0;
}

plugin.c,运行时加载的插件代码:

#include "func.h"

void plugin()
{
printf("plugin\n");
func();
}

如果我用

编译
$ gcc -o main main.c -ldl
$ gcc -shared -fPIC -o plugin.so plugin.c

然后plugin.so无法加载,因为它引用了符号func,无法解析:

$ ./main
dlopen -> (nil), error: ./plugin.so: undefined symbol: func
Segmentation fault (core dumped)

我可以说服主可执行文件通过使用 -rdynamic 进行编译来导出其所有全局符号:

$ gcc -rdynamic -o main main.c -ldl
$ ./main
dlopen -> 0x75e030, error: (null)
plugin
func

但这会用所有符号不必要地填充动态符号表。

(这个动态符号表可以用nm -D main查看。)

问题是,我怎样才能只将“func”添加到主要可执行文件的动态符号表,而不是所有内容。

最佳答案

不幸的是,可执行文件更难实现这一点。您需要生成要导出的符号列表,然后将 -Wl,--dynamic-list=symfile.txt 添加到 LDFLAGS

Here's example它是如何在 Clang 中完成的(以及 here 是他们用来生成符号文件的脚本)。

关于c - -rdynamic 仅用于选择符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com