当有强符号和弱符号时,选择使用强符号

那么我们正可以利用这个原则做以下事情:

  • 定义为弱符号,如果是弱符号,使用默认行为

  • 如果链接了库,是强符号,则使用外部定义行为

以此来实现一个类似插件的功能。通俗一点说:

  • 当没有插件时,使用默认行为

  • 链接了插件时,使用插件的功能

原理和示例

其原理也非常简单:

  • 外部引用弱符号

  • 如果符号地址为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时,执行默认的行为语句。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

骚操作:利用强弱符号制作插件库相关推荐

  1. 学会这个骚操作,再也不怕从删库到跑路

    文章目录 Linux操作系统文件删除原理 如果误删除文件或者数据我们怎么办? 实验思路: 1 . 新加硬盘 2. 进行分区 3. 使用新的分区表,格式化并挂载: 4. 复制一些测试文件,然后把这些文件 ...

  2. C之(6)强弱符号引用

    C之(6)强/弱符号/引用 Author: Once Day Date:2023年1月11日 漫漫长路,有人对你微笑过嘛- 参考引用文档: C语言强.弱符号,强.弱引用 - 牧野星辰 - 博客园 (c ...

  3. DVWA 不跳转_利用url跳转漏洞冒充公安局官网的骚操作

    黑客的骚操作 各位大佬们晚上好.我今天又又又更新了. 刚刚发现了一个漏洞素材,在这里和大家分享一下漏洞以及被利用的用途,这个漏洞乍一看风险不大,实际上被有心人利用起来,非常的可怕,毕竟很少有人会怀疑警 ...

  4. 骚操作,IDEA防止写代码沉迷插件 !

    当初年少懵懂,那年夏天填志愿选专业,父母听其他长辈说选择计算机专业好.从那以后,我的身上就有了计院深深的烙印.从寝室到机房,从机房到图书馆,C.C++.Java.只要是想写点自己感兴趣的东西,一坐就是 ...

  5. Chrome插件:请开始你的表演,smartUp手势骚操作

    故事背景 一天,测试妹子跑来找我帮她查东西,于是打开Chrome就是一顿操作猛如虎,东西还没查到,后面传来妹子的惊呼:哇!xxx,你的电脑还能这样操作吗,用鼠标随便乱划都能操作浏览器的前进.后退.刷新 ...

  6. Linux C++ libdl.so dlfcn.h使用方法(dlopen()、dlsym()、dlclose()、dlerror())(用于动态链接库操作)(懒加载、立即加载)共享库符号、动态库

    文章目录 dlfcn.h解析 - dlopen():打开一个动态链接库文件并返回一个句柄,该句柄用于后续的操作,如查找符号.关闭库等. - dlsym():在打开的动态链接库中查找指定的符号,并返回符 ...

  7. 公众号强制排名被动引流截流 I 骚操作直接利用平台转化收钱原创 桔子wang

    近段时间,随着公众号规则的调整,完善,最暴力关键词引流的时代渐渐过去了,现在留存的基本都是好好操作的玩家了. jian职粉一直是比较火热的粉,一度麦价很高,一个10-30元不等,为啥那么高呢?想想也知 ...

  8. Word原来还能制作请柬,这些Word的骚操作你都知道多少呢?

    不管是学习还是工作,我们经常会使用到Word文档,不过,在大家的常规印象中,Word是一个文字编辑工具,但其实,它还有很多其他的特殊功能哦!今天我们就一起来揭开Word的另类面纱. 一.修改图片背景 ...

  9. arcgis引用样式无符号_【技术积累】arcgis制图应用:符号制作

    软件使用人员从来不会说某某软件太难等等,因为掌握软件的技巧无它,"唯手熟尔".只有经历不同的项目,才能在项目过程中更熟练的掌握技能.实战最能练兵. 所以今天在工作中,遇到gis配图 ...

最新文章

  1. 设置VSCode快速切换多个项目窗口的快捷键Alt+E
  2. SpringBoot 之 MVC
  3. IBM was调试端口开通演示,was服务重启、端口号查看方法
  4. 自定义View,圆形头像
  5. python数据分析的发展前景_Python+BI分析5000条招聘数据,原来数据分析工作在这儿最好找...
  6. C 语言怎么可能被淘汰呢?
  7. redis---安全设置
  8. SSL 延迟与 Http、Https
  9. mysql 事务_MySQL事务隔离级别
  10. Visual Studio 2017正式版离线安装方法
  11. 一些实用型的工具及网站
  12. 项目经理做项目的具体流程
  13. 百度智能云智慧监管平台落地宁波,物联网加持赋能安全生产
  14. 我想把生活折腾成自己想要的样子
  15. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年
  16. 转载:SolidWorks 2014 安装完成破解成功,用过一段时间后提示重新激活(win10系统)...
  17. java springboot房地产信息管理系统+实训报告+PPT+功能需求报告
  18. 开发板Linux手指滑动方向,移动应用滑动屏幕方向判断解决方案,JS判断手势方向...
  19. Win32开发:完整的开发流程
  20. linux 磁盘管理3板斧,df、du、fdisk:Linux磁盘管理三板斧的使用心得(2)

热门文章

  1. Spring Cloud Netflix尤里卡
  2. 介绍OpenHub框架
  3. JDK 9清单:Project Jigsaw,sun.misc.Unsafe,G1,REPL等
  4. jpql hql_无需部署即可测试JPQL / HQL
  5. jaxb util_JAXB自定义绑定– Java.util.Date / Spring 3序列化
  6. JavaFX技巧18:路径剪切
  7. 服务器与客户端渲染(AngularJS与服务器端MVC)
  8. Spring Boot 1.0和Spring Boot 1.0.1错误修复版本
  9. 在Spring MVC Web应用程序中添加社交登录:集成测试
  10. JavaFX中的塔防