成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

騷操作:利用強弱符號制作插件庫

開發 前端
沒有鏈接插件庫時,由于其函數地址為0,因此,我們程序內判斷,if(xxx),當地址為0時,執行默認的行為語句。

[[384132]] 

本文轉載自微信公眾號「編程珠璣」,作者守望先生。轉載本文請聯系編程珠璣(ID:shouwangxiansheng)公眾號。

在《什么是強符號和弱符號》中簡單介紹了強弱符號,那么強弱符號的性質有什么用呢?

還記得在《什么是強符號和弱符號》中提到的鏈接原則嗎?

  • 當有強符號和弱符號時,選擇使用強符號

那么我們正可以利用這個原則做以下事情:

  • 定義為弱符號,如果是弱符號,使用默認行為
  • 如果鏈接了庫,是強符號,則使用外部定義行為

以此來實現一個類似插件的功能。通俗一點說:

  • 當沒有插件時,使用默認行為
  • 鏈接了插件時,使用插件的功能

原理和示例

其原理也非常簡單:

  • 外部引用弱符號
  • 如果符號地址為0,則說明外部沒有鏈接插件庫,未有強符號,走默認流程
  • 如果符號地址不為0,則說明鏈接了插件庫,執行插件庫的功能。

示例程序如下:

  1. // 來源:公眾號【編程珠璣】 
  2. // 作者:守望先生 
  3. #include<stdio.h> 
  4. __attribute__((weak)) void my_print(); 
  5.  void test_print() 
  6.     // 如果是強符號,說明鏈接了外部插件,使用外部定義 
  7.     if(my_print) 
  8.     { 
  9.         my_print(); 
  10.     } 
  11.     else 
  12.     { 
  13.         // 弱符號,走默認邏輯 
  14.         printf("this is weak print\n"); 
  15.     } 
  16. int main(void) 
  17.     test_print(); 
  18.     return 0; 

上面的test_print函數是弱符號,在沒有其他地方定義的情況下,也是能夠正常編譯運行的:

  1. $ gcc -o main main.c 
  2. $ ./main 
  3. this is weak print 

觀察可執行文件:

  1. $ nm main |grep my_print 
  2.            w my_print 

通過nm命令我們也可以知道test_print是弱符號,它前面的修飾字符是W,代表weak。

插件庫

前面的示例程序已經能否工作了,如何讓它能否支持插件庫呢?或者說,如何讓它支持外部的插件功能呢?

關于制作庫(靜態庫或動態庫制作可以參考《手把手教你制作靜態庫》)

這里以靜態庫為例:

  1. // print_plugin.c 
  2. #include<stdio.h> 
  3. void my_print() 
  4.     printf("this is plugin print\n"); 

制作靜態庫:

  1. $ gcc -c print_plugin.c 
  2. $ ar -rcs libprint_plugin.a print_plugin.o 

鏈接插件庫

現在重新編譯main程序,并使用插件庫:

  1. $ gcc -o main main.c -L./ -lprint_plugin 
  2. $ gcc  -o main  main.c  -L. -Wl,--whole-archive -lprint_plugin -Wl,--no-whole-archive 
  3. $ nm main |grep my_print 
  4. 000000000000067a T my_print 
  5. $ ./main 
  6. this is plugin print 

需要注意的是,這里在鏈接插件庫之前,需要加上:

  1. -Wl,--whole-archive 

該選項會將插件庫中所有符號都鏈接進來,若非如此,在main.c中已經有了my_print符號,將不會鏈接進來,而在此之后,又要將該選項恢復。最終我們可以通過nm命令看到my_print符號已經不再是W了。也就看到了最后:

  1. this is plugin print 

的打印了。

也就實現了我們所謂插件的功能,換句話說,可以對目標程序進行功能的裁剪或者增加。

總結

由于以下幾點原因,我們可以自己做一些支持插件庫的程序:

1.重復強弱符號同存在時,使用強符號

2.弱符號鏈接不存在時,不會報錯

3.未鏈接的外部符號,地址為0,可通過判斷避免訪問非法地址

再結合前面的例子分別解釋一下:

1.這一點在《什么是強符號和弱符號》一文中已經有解釋說明了

2.在開始的程序中,即便沒有鏈接插件庫,程序也可以正常編譯鏈接通過,而不會報錯

3.沒有鏈接插件庫時,由于其函數地址為0,因此,我們程序內判斷,if(xxx),當地址為0時,執行默認的行為語句。

 

責任編輯:武曉燕 來源: 編程珠璣
相關推薦

2024-11-13 16:19:12

2020-11-16 07:15:41

Linux權限管理

2019-05-23 14:59:21

PythonPDF編程語言

2021-04-19 09:15:14

老板公司企業

2018-11-30 09:30:46

aiohttp爬蟲Python

2022-07-27 08:24:44

數據庫RTOSQL

2025-03-25 10:49:13

2022-04-25 08:43:47

pandas代碼Python

2022-08-18 15:03:13

并發編程

2020-11-16 11:50:21

Python代碼命令

2021-06-08 07:04:45

Service Mes微服務熔斷

2011-07-05 18:04:45

QT Mysql

2020-11-23 11:30:00

IDEA技巧開發

2020-03-16 08:41:00

互聯網疫情公司

2020-04-03 13:43:23

Python列表推導式字典推導式

2021-11-03 17:04:11

攔截器操作Servlet

2023-07-26 07:41:27

2020-03-11 20:11:06

電腦騷操作AMD

2020-04-27 20:55:42

JavaJava 8編程語言

2021-08-05 18:21:29

Autowired代碼spring
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产激情视频在线观看 | 成年人精品视频在线观看 | 国产精品1 | 色综合激情 | av毛片在线| 国产精品国产三级国产aⅴ无密码 | 成人av电影网 | 日韩一区二区三区在线观看 | 国产精品视频偷伦精品视频 | 欧美精品三区 | а_天堂中文最新版地址 | 国产我和子的乱视频网站 | 亚洲一区综合 | 欧美日韩专区 | 一区二区三区久久久 | 白浆在线| 日韩av资源站 | 老头搡老女人毛片视频在线看 | 成人福利片 | 日本超碰在线 | 成人亚洲精品 | 久久久久国产精品 | 国产精品国色综合久久 | 国产成人免费视频 | 久久久精品综合 | h片在线播放 | www.夜夜骑.com | 亚洲一区二区三区四区五区午夜 | 久久免费视频在线 | 成av在线 | 亚洲性网 | 国产99视频精品免费视频7 | 97久久精品午夜一区二区 | 国产精品视频在线播放 | 在线观看免费av网 | 欧美一级片在线观看 | 久久久久国产 | 国产91久久久久蜜臀青青天草二 | 国产精品伦理一区 | 精品久久久久久亚洲精品 | 91国产精品 |