Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从我的库中调用可执行文件中的函数?_C_Linux_Dlopen - Fatal编程技术网

C 如何从我的库中调用可执行文件中的函数?

C 如何从我的库中调用可执行文件中的函数?,c,linux,dlopen,C,Linux,Dlopen,我有一个可执行文件和一个动态库(.so)。库导出一些符号并成功地调用它。但我想让库调用可执行文件的函数成为可能。我已尝试在可执行文件中执行以下操作: //test extern "C" void print(const char * str) { std::cout << str << std::endl; } 但是当我在可执行文件中调用dlopen(加载库)时,它返回错误未定义的符号:print。我怎样才能修好它 实现这一点的一个更简单的方法是让可执行文件注册

我有一个可执行文件和一个动态库(.so)。库导出一些符号并成功地调用它。但我想让库调用可执行文件的函数成为可能。我已尝试在可执行文件中执行以下操作:

//test
extern "C" void print(const char * str) {
    std::cout << str << std::endl;
}

但是当我在可执行文件中调用
dlopen
(加载库)时,它返回错误
未定义的符号:print
。我怎样才能修好它

实现这一点的一个更简单的方法是让可执行文件注册一个函数供库以后使用,库存储一个指向该函数的指针,并可能在以后调用它。

在Linux/ELF中,您可以将
-export-dynamic
选项传递给链接器(
-rddynamic
在编译器驱动程序
gcc
上)因此,可执行文件中的符号将导出到共享对象

您的库中会有一个虚拟的
print
实现,它会被可执行文件上的实现隐藏,因为通常在共享对象之前搜索可执行文件以获得符号解析

这有一个缺点,即它不是非常细粒度的,最终可能会覆盖一些您不打算覆盖的符号。更细粒度的选项是创建要导出的符号列表,如下所示:

{
    print;
    <other symbols>
};
{
印刷品;
};

然后将该列表传递给链接器,例如从gcc:
-Wl,--dynamic list=

@milo:我添加了一种更细粒度的方法,可以从可执行文件导出符号。非常感谢!我想我最好读一下“dso howto”,以获得更多关于共享对象的综合知识。对其他主要平台说几句话就好了。
{
    print;
    <other symbols>
};