为什么编译共享库后函数的名称会发生变化?

Why function's names change after compiling a shared library?

本文关键字:变化 共享 编译 函数 为什么      更新时间:2023-10-16

lib.c包含:

#include <stdio.h>
void testFunction()
{
    printf("This is the testFunction from lib.so");
}

我用这个命令编译了文件:

g++ -fPIC -shared lib.c -o lib.so

在lib.so上运行nm之后,我发现testFunction变成了_Z12testFunctionv。为什么?我认为当使用dlsym加载函数时,这是一个大问题。

您使用C++编译器g++编译了一个C程序(您的小C代码恰好是有效的C++代码)。所以你会发现一些名字被篡改了。您应该使用gcc(它是同一编译器套件GCC的一部分…):

 gcc -Wall -g -O -fPIC -shared lib.c -o lib.so

(我强烈建议使用-Wall进行编译以获得所有警告,使用-g进行编译以获取调试信息;优化标志-O是可选的-可以使用-O2进行更多优化-并可能提高生成的插件的性能)

如果您想将C++与dlopen&dlsym一定要阅读C++dlopen迷你操作指南。

不要忘记阅读有关调用GCC 的文档

如果您想避免在真正的C++代码中篡改名称,请将函数声明为extern "C"

您需要研究"C++名称篡改"。

参数类型及更多类型编码在编译器生成的最终名称中。

如果您不希望这样(例如,如果您希望函数可以从C上下文中调用),那么您应该将其设置为extern "C"