如何在在動態鏈接庫中調用外部函數?
大家好,我是一個動態鏈接庫!
這個名字,相信你一定早就如雷貫耳了。
在計算機早期時代,由于內存資源緊張,我可是發揮了重大的作用!
不論是在 Windows 系統中,還是在 Unix 系列平臺上,到處都能見到我的身影,因為我能為大家節省很多資源啊,資源就是人民幣!
愉快的玩耍
比如:我的主人編寫了這么一段簡單的代碼:
# 文件:lib.c
#include <stdio.h>
int func_in_lib(int k)
{
printf("func_in_lib is called ");
return k + 1;
}
只要用如下命令來編譯,我就誕生出來了 lib.so,也就是一個動態鏈接庫:
$ gcc -m32 -fPIC --shared -o lib.so lib.c
這個時候,主人隨便把我丟給誰,我都可以為他服務,只要他調用我肚子里的這個函數 func_in_lib 就可以了。
雖然目前你看到我提供的這個函數很簡單,但是道理都是一樣的,后面如果有機會,我就在這個函數里來計算機器人的運動軌跡,給你瞧一瞧!
例如:張三今天寫了一段代碼,需要調用我的這個函數。
張三這個人比較喜歡騷操作,明明他在編譯可執行程序的時候,把我動態鏈接一下就可以了,就像下面這樣:
$ gcc -m32 -o main main.c ./lib.so
但是張三偏偏不這么做,為了炫技,他選擇使用 dlopen 動態加載的方式,來把我從硬盤上加載到進程中。
咱們來一起圍觀一下張三寫的可執行程序代碼:
# 文件:main.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
typedef int (*pfunc)(int);
int main(int argc, char *agv[])
{
int a = 1;
int b;
// 打開動態庫
void *handle = dlopen("./lib.so", RTLD_NOW);
if (handle)
{
// 查找動態庫中的函數
pfunc func = (pfunc) dlsym(handle, "func_in_lib");
if (func)
{
b = func(a);
printf("b = %d ", b);
}
else
{
printf("dlsym failed! ");
}
dlclose(handle);
}
else
{
printf("dlopen failed! ");
}
return 0;
}
從代碼中可以看到,張三預先知道我肚子里的這個函數名稱是 func_in_lib,所以他使用了系統函數 dlsym(handle, "func_in_lib"); 來找到這個函數在內存中的加載地址,然后就可以直接調用這個函數了。
張三編譯得到可執行文件 main 之后,執行結果完全正確,很開心!
悲從中來
可是有一天,我遇到一件煩人的事情,我的主人說:你這個服務函數的計算過程太單調了,給你找點樂子,你在執行的時候啊,到其他一個外部模塊里調用一個函數。
話剛說完,就丟給我一個函數名:void func_in_main(void);。
也就是說,我需要在我的服務函數中,去調用其他模塊里的函數,就像下面這樣:
#include <stdio.h>
// 外部函數聲明
void func_in_main(void);
int func_in_lib(int k)
{
printf("func_in_lib is called ");
// 調用外部函數
func_in_main();
return k + 1;
}
那么這個函數在哪里呢?天哪,我怎么知道這個函數是什么鬼?怎么才能找到它藏在內存的那個角落(地址)里?
不管怎么樣,主人修改了代碼之后,還是很順利的把我編譯了出來:
$ gcc -m32 -fPIC --shared -o lib.so lib.c
編譯指令完全沒有變化。
因為我僅僅是一個動態鏈接庫,這個時候即使我不知道 func_in_main 函數的地址,也是可以編譯成功的。
只不過我要把這個家伙標記一下:誰要是想使用我,就必須告訴我這個家伙的地址在哪里!,否則就別怪我耍賴。
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













