骚操作:利用强弱符号制作插件库
当有强符号和弱符号时,选择使用强符号
那么我们正可以利用这个原则做以下事情:
定义为弱符号,如果是弱符号,使用默认行为
如果链接了库,是强符号,则使用外部定义行为
以此来实现一个类似插件的功能。通俗一点说:
当没有插件时,使用默认行为
链接了插件时,使用插件的功能
原理和示例
其原理也非常简单:
外部引用弱符号
如果符号地址为0,则说明外部没有链接插件库,未有强符号,走默认流程
如果符号地址不为0,则说明链接了插件库,执行插件库的功能。
示例程序如下:
#include
__attribute__((weak)) void my_print();void test_print()
{// 如果是强符号,说明链接了外部插件,使用外部定义if(my_print){my_print();}else{// 弱符号,走默认逻辑printf("this is weak print\n");}
}
int main(void)
{test_print();return 0;
}
上面的test_print函数是弱符号,在没有其他地方定义的情况下,也是能够正常编译运行的:
$ gcc -o main main.c
$ ./main
this is weak print
观察可执行文件:
$ nm main |grep my_printw my_print
通过nm命令我们也可以知道test_print是弱符号,它前面的修饰字符是W,代表weak。
插件库
前面的示例程序已经能否工作了,如何让它能否支持插件库呢?或者说,如何让它支持外部的插件功能呢?
这里以静态库为例:
// print_plugin.c
#include
void my_print()
{printf("this is plugin print\n");
}
制作静态库:
$ gcc -c print_plugin.c
$ ar -rcs libprint_plugin.a print_plugin.o
链接插件库
现在重新编译main程序,并使用插件库:
$ gcc -o main main.c -L./ -lprint_plugin
$ gcc -o main main.c -L. -Wl,--whole-archive -lprint_plugin -Wl,--no-whole-archive
$ nm main |grep my_print
000000000000067a T my_print
$ ./main
this is plugin print
需要注意的是,这里在链接插件库之前,需要加上:
-Wl,--whole-archive
该选项会将插件库中所有符号都链接进来,若非如此,在main.c中已经有了my_print符号,将不会链接进来,而在此之后,又要将该选项恢复。最终我们可以通过nm命令看到my_print符号已经不再是W了。也就看到了最后:
this is plugin print
的打印了。
也就实现了我们所谓插件的功能,换句话说,可以对目标程序进行功能的裁剪或者增加。
总结
由于以下几点原因,我们可以自己做一些支持插件库的程序:
1.重复强弱符号同存在时,使用强符号
2.弱符号链接不存在时,不会报错
3.未链接的外部符号,地址为0,可通过判断避免访问非法地址
再结合前面的例子分别解释一下:
1.在开始的程序中,即便没有链接插件库,程序也可以正常编译链接通过,而不会报错
2.没有链接插件库时,由于其函数地址为0,因此,我们程序内判断,if(xxx),当地址为0时,执行默认的行为语句。
声明:
本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
骚操作:利用强弱符号制作插件库相关推荐
- 学会这个骚操作,再也不怕从删库到跑路
文章目录 Linux操作系统文件删除原理 如果误删除文件或者数据我们怎么办? 实验思路: 1 . 新加硬盘 2. 进行分区 3. 使用新的分区表,格式化并挂载: 4. 复制一些测试文件,然后把这些文件 ...
- C之(6)强弱符号引用
C之(6)强/弱符号/引用 Author: Once Day Date:2023年1月11日 漫漫长路,有人对你微笑过嘛- 参考引用文档: C语言强.弱符号,强.弱引用 - 牧野星辰 - 博客园 (c ...
- DVWA 不跳转_利用url跳转漏洞冒充公安局官网的骚操作
黑客的骚操作 各位大佬们晚上好.我今天又又又更新了. 刚刚发现了一个漏洞素材,在这里和大家分享一下漏洞以及被利用的用途,这个漏洞乍一看风险不大,实际上被有心人利用起来,非常的可怕,毕竟很少有人会怀疑警 ...
- 骚操作,IDEA防止写代码沉迷插件 !
当初年少懵懂,那年夏天填志愿选专业,父母听其他长辈说选择计算机专业好.从那以后,我的身上就有了计院深深的烙印.从寝室到机房,从机房到图书馆,C.C++.Java.只要是想写点自己感兴趣的东西,一坐就是 ...
- Chrome插件:请开始你的表演,smartUp手势骚操作
故事背景 一天,测试妹子跑来找我帮她查东西,于是打开Chrome就是一顿操作猛如虎,东西还没查到,后面传来妹子的惊呼:哇!xxx,你的电脑还能这样操作吗,用鼠标随便乱划都能操作浏览器的前进.后退.刷新 ...
- Linux C++ libdl.so dlfcn.h使用方法(dlopen()、dlsym()、dlclose()、dlerror())(用于动态链接库操作)(懒加载、立即加载)共享库符号、动态库
文章目录 dlfcn.h解析 - dlopen():打开一个动态链接库文件并返回一个句柄,该句柄用于后续的操作,如查找符号.关闭库等. - dlsym():在打开的动态链接库中查找指定的符号,并返回符 ...
- 公众号强制排名被动引流截流 I 骚操作直接利用平台转化收钱原创 桔子wang
近段时间,随着公众号规则的调整,完善,最暴力关键词引流的时代渐渐过去了,现在留存的基本都是好好操作的玩家了. jian职粉一直是比较火热的粉,一度麦价很高,一个10-30元不等,为啥那么高呢?想想也知 ...
- Word原来还能制作请柬,这些Word的骚操作你都知道多少呢?
不管是学习还是工作,我们经常会使用到Word文档,不过,在大家的常规印象中,Word是一个文字编辑工具,但其实,它还有很多其他的特殊功能哦!今天我们就一起来揭开Word的另类面纱. 一.修改图片背景 ...
- arcgis引用样式无符号_【技术积累】arcgis制图应用:符号制作
软件使用人员从来不会说某某软件太难等等,因为掌握软件的技巧无它,"唯手熟尔".只有经历不同的项目,才能在项目过程中更熟练的掌握技能.实战最能练兵. 所以今天在工作中,遇到gis配图 ...
最新文章
- 设置VSCode快速切换多个项目窗口的快捷键Alt+E
- SpringBoot 之 MVC
- IBM was调试端口开通演示,was服务重启、端口号查看方法
- 自定义View,圆形头像
- python数据分析的发展前景_Python+BI分析5000条招聘数据,原来数据分析工作在这儿最好找...
- C 语言怎么可能被淘汰呢?
- redis---安全设置
- SSL 延迟与 Http、Https
- mysql 事务_MySQL事务隔离级别
- Visual Studio 2017正式版离线安装方法
- 一些实用型的工具及网站
- 项目经理做项目的具体流程
- 百度智能云智慧监管平台落地宁波,物联网加持赋能安全生产
- 我想把生活折腾成自己想要的样子
- Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年
- 转载:SolidWorks 2014 安装完成破解成功,用过一段时间后提示重新激活(win10系统)...
- java springboot房地产信息管理系统+实训报告+PPT+功能需求报告
- 开发板Linux手指滑动方向,移动应用滑动屏幕方向判断解决方案,JS判断手势方向...
- Win32开发:完整的开发流程
- linux 磁盘管理3板斧,df、du、fdisk:Linux磁盘管理三板斧的使用心得(2)
热门文章
- Spring Cloud Netflix尤里卡
- 介绍OpenHub框架
- JDK 9清单:Project Jigsaw,sun.misc.Unsafe,G1,REPL等
- jpql hql_无需部署即可测试JPQL / HQL
- jaxb util_JAXB自定义绑定– Java.util.Date / Spring 3序列化
- JavaFX技巧18:路径剪切
- 服务器与客户端渲染(AngularJS与服务器端MVC)
- Spring Boot 1.0和Spring Boot 1.0.1错误修复版本
- 在Spring MVC Web应用程序中添加社交登录:集成测试
- JavaFX中的塔防