dlopen找不到符合标准的符号

 无敌小志哥_443 发布于 2022-12-25 15:08

我试图允许共享库从正在加载的进程中调用一个函数.该库是用C语言编写的,C语言是C++中的"内核".

kernel.cpp:

#include 
#include 

typedef void(*func_t)();

extern "C" {
        void test();
}

int main() {
        char *error;
        void *handle = dlopen("./library.so", RTLD_LAZY);
        if((error = dlerror()) != NULL) {
                fprintf(stderr, "%s\n", error);
                return 1;
        }
        func_t init = (func_t)dlsym(handle, "init");
        if((error = dlerror()) != NULL) {
                fprintf(stderr, "%s\n", error);
                return 1;
        }
        init();

        return 0;
}

void test() {
        fprintf(stderr, "test() called.\n");
}

LIBRARY.C:

#include 

void test();

void init() {
        fprintf(stderr, "init() called.\n");
        test();
}

生成文件:

all:
        g++ -ldl kernel.cpp -o kernel
        gcc -fpic -shared library.c -o library.so
        ./kernel

objdump -x内核

SYMBOL TABLE: 
... 
000000000040088b g     F .text  0000000000000024    test

运行程序,我得到以下输出:

init() called.
./kernel: symbol lookup error: ./library.so: undefined symbol: test

如果我将dlopen更改为使用RTLD_NOW,我会得到:

./library.so: undefined symbol: test

为什么图书馆很难找到那个符号,当它明显没有被破坏,坐在那里?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有