linux如何让我定义的函数在程序加载动态库之前执行?

bandaoyu 2021-03-15 05:10:20
我的程序 myPro代码中我定义了一个函数void printVersion();
我的程序依赖dowork.so;

如何让我的函数printVersion 在myPro加载dowork.so 之前执行?

...全文
1777 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
luj_1768 2021-03-22
  • 打赏
  • 举报
回复
版本显示问题通常只与系统权限有关。如果dlopen都不好用,也就没有什么可推荐的了。不知道大家是否有好用的设备推荐?softIce是不是有更高权限的?
NorZ 2021-03-22
  • 打赏
  • 举报
回复
print Version 如果输出是静态,那直接 dump 符号表获取字段判断,然后再决定要不要启动程序不就行了?
赵4老师 2021-03-22
  • 打赏
  • 举报
回复
ldd命令不好使吗?
老大爷的悲伤 2021-03-22
  • 打赏
  • 举报
回复
明明您你迷你号
bandaoyu 2021-03-18
  • 打赏
  • 举报
回复
引用 20 楼 flying_music 的回复:
业务: 我的程序 myPro代码中我定义了一个函数void printVersion(); 我的程序myPro依赖dowork.so; 如何让我的函数printVersion 在myPro加载dowork.so 之前执行?
  • 打赏
  • 举报
回复
引用 14 楼 bandaoyu 的回复:
[quote=引用 11 楼 flying_music 的回复:]建议你把整个业务环境描述一下,就是为什么要加载so之前执行你的函数,可能一开始技术方向就偏了
想打印出版本(编译时间),确认程序没有编错,然后再从编译机获取下来。因为编译机是隔离的,所以每次获取到测试机都很麻烦,所以一般都要确认好。[/quote] 你这个功能没法像你描述的这样做吧,就像你想安装某个版本的微信,你的意思是想提前知道是不是你要的微信版本,再来选择安装,一是微信本身提供版本号查看,那得你安装了以后才能看,二是你可以用过应用商城去查看,那也是商城里提前备案的。 动态库加不加载跟你用不用没啥关系啊,用dlopen加载后,调用下printVersion,不是这个版本,在用dlclose关闭不就行了。
flying_music 2021-03-18
  • 打赏
  • 举报
回复
引用 26 楼 bandaoyu 的回复:
[quote=引用 25 楼 flying_music 的回复:]
不是的哈,我是要确认myPro的版本,不是.so的版本。 当然你说的显示.so的版本也是个不错的功能,我能想到的是.so里面,定义一个class A,class A 的构造函数里面 打印.so的版本 A(){ print version},然后,so里面定义一个全局的对象: A a; 这样.so被加载进内存后就会执行A a,打印出so的版本。这个思路对吗[/quote] 如果只是看进程的版本,那跟加载so的顺序也没啥关系了,系统加载so的效率很高的,不建议先确认进程版本,没问题再加载so来“优化什么东西”,容易得不偿失 后面你说的应该可以实现so版本自动打印(加载so的时候打印),但也不太好(就算不是so里,定义全局变量也不是什么值得推荐的,so里就更不推荐了),不如加载之后直接调用一个接口来的方便直接
bandaoyu 2021-03-18
  • 打赏
  • 举报
回复
引用 25 楼 flying_music 的回复:
不是的哈,我是要确认myPro的版本,不是.so的版本。 当然你说的显示.so的版本也是个不错的功能,我能想到的是.so里面,定义一个class A,class A 的构造函数里面 打印.so的版本 A(){ print version},然后,so里面定义一个全局的对象: A a; 这样.so被加载进内存后就会执行A a,打印出so的版本。这个思路对吗
flying_music 2021-03-18
  • 打赏
  • 举报
回复
引用 21 楼 嵌入式这个大坑啊 的回复:
[quote=引用 14 楼 bandaoyu 的回复:][quote=引用 11 楼 flying_music 的回复:]建议你把整个业务环境描述一下,就是为什么要加载so之前执行你的函数,可能一开始技术方向就偏了
想打印出版本(编译时间),确认程序没有编错,然后再从编译机获取下来。因为编译机是隔离的,所以每次获取到测试机都很麻烦,所以一般都要确认好。[/quote] 你这个功能没法像你描述的这样做吧,就像你想安装某个版本的微信,你的意思是想提前知道是不是你要的微信版本,再来选择安装,一是微信本身提供版本号查看,那得你安装了以后才能看,二是你可以用过应用商城去查看,那也是商城里提前备案的。 动态库加不加载跟你用不用没啥关系啊,用dlopen加载后,调用下printVersion,不是这个版本,在用dlclose关闭不就行了。[/quote] 奥,你是对楼主说的啊,那没事了,哈哈 咱俩理解是一致的,不加载so是没办法知道so版本的 不过dlopen其实没那么好用,每个符号都得dlsym一下,会严重破坏之前的程序结构,还会将编译错误推迟到链接或运行时
flying_music 2021-03-18
  • 打赏
  • 举报
回复
引用 22 楼 bandaoyu 的回复:
[quote=引用 20 楼 flying_music 的回复:]
业务: 我的程序 myPro代码中我定义了一个函数void printVersion(); 我的程序myPro依赖dowork.so; 如何让我的函数printVersion 在myPro加载dowork.so 之前执行?[/quote] 你的printVersion 是如果确认so版本的?不加载so就能知道so的版本吗,有这种黑科技?
flying_music 2021-03-18
  • 打赏
  • 举报
回复
引用 21 楼 嵌入式这个大坑啊 的回复:
[quote=引用 14 楼 bandaoyu 的回复:][quote=引用 11 楼 flying_music 的回复:]建议你把整个业务环境描述一下,就是为什么要加载so之前执行你的函数,可能一开始技术方向就偏了
想打印出版本(编译时间),确认程序没有编错,然后再从编译机获取下来。因为编译机是隔离的,所以每次获取到测试机都很麻烦,所以一般都要确认好。[/quote] 你这个功能没法像你描述的这样做吧,就像你想安装某个版本的微信,你的意思是想提前知道是不是你要的微信版本,再来选择安装,一是微信本身提供版本号查看,那得你安装了以后才能看,二是你可以用过应用商城去查看,那也是商城里提前备案的。 动态库加不加载跟你用不用没啥关系啊,用dlopen加载后,调用下printVersion,不是这个版本,在用dlclose关闭不就行了。[/quote] 这不是楼主说要先确认版本,再拿到测试机器上跑的吗。。。。你在进程里写的printVersion,怎么查看so的信息呢,如果是通过调用so里的接口,那也没必要dlopen啊,直接加载调用也行啊,结果不一致就退出进程不跟你调用dlclose一样吗?你调用dlclose后,进程还能继续跑?还是有多个待选的so,轮流试一遍?
flying_music 2021-03-17
  • 打赏
  • 举报
回复
引用 14 楼 bandaoyu 的回复:
[quote=引用 11 楼 flying_music 的回复:]建议你把整个业务环境描述一下,就是为什么要加载so之前执行你的函数,可能一开始技术方向就偏了
想打印出版本(编译时间),确认程序没有编错,然后再从编译机获取下来。因为编译机是隔离的,所以每次获取到测试机都很麻烦,所以一般都要确认好。[/quote] 还是没太懂,你的编译时间是写到so里面了吗?如果是写到so里面,那不加载怎么获取呢?无论是运行时加载还是调用时加载,还是dlopen手动加载,不都是先加载才能调用里面的接口吗? 如果只是从外面看一下文件的生成时间,那还不如写启动脚本去做前置校验,然后再启动业务进程,不是这个逻辑吗
bandaoyu 2021-03-17
  • 打赏
  • 举报
回复
引用 17 楼 Easy Coder 的回复:
其实你可以把这个库变为插件,这样就可以在程序运行起来后动态加载,可以了解一些插件的机制
你这个方案 应该是和3楼一样的吧, 好像
bandaoyu 2021-03-17
  • 打赏
  • 举报
回复
引用 16 楼 Cynhard85 的回复:
写一个壳程序,调用 printVersion 并启动你的主程序
壳程序怎么调 主程序里的printVersion 函数?
QtHalcon 2021-03-17
  • 打赏
  • 举报
回复
其实你可以把这个库变为插件,这样就可以在程序运行起来后动态加载,可以了解一些插件的机制
Cynhard 2021-03-17
  • 打赏
  • 举报
回复
写一个壳程序,调用 printVersion 并启动你的主程序
flying_music 2021-03-16
  • 打赏
  • 举报
回复
建议你把整个业务环境描述一下,就是为什么要加载so之前执行你的函数,可能一开始技术方向就偏了
  • 打赏
  • 举报
回复
引用 8 楼 bandaoyu 的回复:
我的需求是:myPro代码中我定义了一个函数void printVersion();,如何让我的函数printVersion 在myPro加载dowork.so 之前执行? 不是你说的那些
我理一下你的需求哈: 1.你的程序中定义了一个函数void printVersion(); 2.你的程序依赖dowork.so ,程序启动的时候,会自动加载dowork.so 3.你想你的程序在加载dowork.so 之前,就执行printVersion(); 函数。 是不是? 如果是这样,那么用我说的方法应该是没错的。 和你原来的程序比,主要变动的是第2点,让你的程序不自动加载dowork.so,就可以控制在dowork.so加载前执行printVersion();。 然后用dlopen打开dowork.so 动态库,用dlsym获取这个库里面的函数地址。就可以使用动态库里面的函数了。 当然如果你还想使用自动加载动态库。那么可以使用1楼说的方法: 定义 void __attribute__ ((constructor)) my_load(void); void __attribute__ ((destructor)) my_unload(void); 可以使用gcc扩张属性__attribute__((constructor)) and __attribute__((destructor))来实现 类似于全局类变量,其构造函数及析构函数会在加载时自动调用。 详见:https://www.cnblogs.com/D3Hunter/archive/2013/07/07/3175770.html
sdghchj 2021-03-16
  • 打赏
  • 举报
回复
引用 7 楼 bandaoyu 的回复:
[quote=引用 6 楼 sdghchj 的回复:] 静态加载本来就是main执行之前。
我的需求是:如何让我的函数printVersion 在myPro加载dowork.so 之前执行?[/quote] 动态库的隐式加载和显示加载,不明白? “道理我都懂,可鸽子为什么这么大?”
bandaoyu 2021-03-16
  • 打赏
  • 举报
回复
引用 5 楼 zjq9931 的回复:
[quote=引用 4 楼 bandaoyu 的回复:][quote=引用 3 楼 zjq9931 的回复:]。
不是呀[/quote] 怎么不是呢?[/quote] 我的需求是:myPro代码中我定义了一个函数void printVersion();,如何让我的函数printVersion 在myPro加载dowork.so 之前执行? 不是你说的那些
加载更多回复(10)

65,196

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧