DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

存在程序main通过dlopen使用libA中的符号:

main.c:

1 #include <stdio.h>
 2 #include <dlfcn.h>
 3 
 4 typedef void (*func)(void); 
 5 
 6 
 7 void test_main()
 8 {
 9     return;
10 }
11 
12 
13 int main()
14 {
15     void *handle = dlopen("./libA.so", RTLD_NOW|RTLD_GLOBAL);
16     if(NULL == handle)
17     {
18         fprintf(stderr, "%s\n", dlerror());
19         return 1;
20     }
21     func test = dlsym(handle, "test");
22 
23     (*test)();
24 
25     return 0;
26 
27 }

libA的代码又反向依赖main中符号:

1 void test()
2 {
3     test_main();
4     return;
5 }

 

这样,gcc -g main.c -ldl 编译程序(注意这里没有链接libA),运行程序main时会报错,报错的原因就是dlopen失败,失败的原因就是:

  • ./libA.so: undefined symbol: test_main

 

解决方法有两个:

A、不要dlopen打开这个库,即注释掉dl过程直接调用test,此时直接大大方方的-l就可以了

  • gcc -g main_ld.c -L. -lA

B、 使用所述参数,将test_main放到程序main的动态符号表中,保证dlopen的成功:

  • gcc -rdynamic -g main.c -ldl

 

 
posted on   DoubleLi  阅读(193)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-07-21 RTC 系统音视频传输弱网对抗技术
2021-07-21 FFMPEG AvFilter使用实例(实现视频缩放,裁剪,水印等)
2021-07-21 FFmpeg filter
2021-07-21 ffmpeg用filter实现视频scale
2021-07-21 H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
2021-07-21 解码前世今生——avcodec
2021-07-21 ffmpeg结构体(6)之AVFrame及其相关函数
点击右上角即可分享
微信分享提示