新聞中心
動態(tài)庫是在程序運(yùn)行時才被載入的,可以大大減小程序體積,提高程序運(yùn)行速度的鏈接庫。在Linux下,我們可以使用一些工具來測試動態(tài)庫接口,以確保其正確性和可靠性。本文將介紹一些常用的Linux下動態(tài)庫接口測試工具和測試方法,并提供一些簡易指南,幫助初學(xué)者更好地進(jìn)行動態(tài)庫接口測試。

鹽湖ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
一、動態(tài)庫接口測試概述
動態(tài)庫接口測試是測試動態(tài)庫是否能夠正確地鏈接和使用,以及是否具有預(yù)期的功能和行為。動態(tài)庫接口包括函數(shù)名、參數(shù)類型、返回類型等,它們必須與其他應(yīng)用程序或庫的接口嚴(yán)格匹配,否則就會出現(xiàn)鏈接錯誤或運(yùn)行時錯誤。
動態(tài)庫接口測試的目的是驗證應(yīng)用程序或庫能夠成功地調(diào)用動態(tài)庫的接口,并且處理不同的輸入和異常情況時能夠正確地響應(yīng)。測試用例應(yīng)涵蓋所有的接口函數(shù)和參數(shù)類型,并包括相關(guān)的邊界條件和異常情況。
二、常用的動態(tài)庫接口測試工具
1. ldd
ldd命令用來列出一個動態(tài)庫所依賴的其他庫,可以用來檢查動態(tài)庫的依賴關(guān)系和版本信息,以保證程序能夠正確鏈接并運(yùn)行。
例如:
“`
$ ldd libtest.so
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fd40a29d000)
libm.so.6 => /lib64/libm.so.6 (0x00007fd409f2f000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd409d17000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd40994e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd40a6bb000)
“`
2. nm
nm命令用來顯示動態(tài)庫中包含的符號列表,包括函數(shù)名、變量名和其他符號等,可以用來檢查動態(tài)庫中的接口是否正確定義和實現(xiàn)。
例如:
“`
$ nm libtest.so
U _ZNSt7__cxx1112basic_stringIcSt11char_trtsIcESaIcEEC1Ev
00000000000010e0 T func1
0000000000001140 T func2
U puts@@GLIBC_2.2.5
U strlen@@GLIBC_2.2.5
U std::__cxx11::basic_string, std::allocator >::size() const
“`
3. objdump
objdump命令用于查看二進(jìn)制文件的指令、符號、重定向表和其他信息。可以用objdump命令來檢查動態(tài)庫的接口是否正確實現(xiàn)、是否存在潛在的安全漏洞等。
例如:
“`
$ objdump -T libtest.so
libtest.so: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000000 D *UND* 0000000000000000 GLIBC_2.2.5 puts
0000000000000000 D *UND* 0000000000000000 GLIBC_2.2.5 strlen
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __libc_start_mn
0000000000001020 g DF .text 0000000000000020 Base func1
0000000000001080 g DF .text 0000000000000020 Base func2
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize
“`
4. gdb
gdb是GNU調(diào)試器,可以用來調(diào)試動態(tài)庫中的函數(shù),查找并修復(fù)相關(guān)的錯誤和故障。
例如:
“`
$ gdb ./test
(gdb) b func1
(gdb) r
(gdb) step
(gdb) p ret
$1 = 10
(gdb) step
(gdb) p ret
$2 = 20
(gdb) q
“`
五、動態(tài)庫接口測試方法
動態(tài)庫接口測試方法包括手動測試和自動測試兩種。手動測試是通過手工執(zhí)行測試用例來檢查動態(tài)庫接口的正確性和可靠性;而自動測試則是通過一些工具來自動化執(zhí)行測試用例和檢查測試結(jié)果。
1. 手動測試
手動測試需要編寫測試用例并對其進(jìn)行手工執(zhí)行,以模擬不同的輸入和異常情況,并檢查測試結(jié)果是否與預(yù)期相符。
例如:
測試用例1:測試func1函數(shù)的功能和正確性
“`
#include
#include “l(fā)ibtest.h”
int mn() {
int ret1, ret2, expect1, expect2;
ret1 = func1(2, 3);
expect1 = 5;
if (ret1 != expect1) {
printf(“func1 test fled: expect %d, but got %d\n”, expect1, ret1);
}
ret2 = func1(-2, 3);
expect2 = 1;
if (ret2 != expect2) {
printf(“func1 test fled: expect %d, but got %d\n”, expect2, ret2);
}
return 0;
}
“`
測試用例2:測試func2函數(shù)的功能和正確性
“`
#include
#include “l(fā)ibtest.h”
int mn() {
const char* str = “hello”;
int ret1, ret2, expect1, expect2;
ret1 = func2(str);
expect1 = 5;
if (ret1 != expect1) {
printf(“func2 test fled: expect %d, but got %d\n”, expect1, ret1);
}
ret2 = func2(NULL);
expect2 = -1;
if (ret2 != expect2) {
printf(“func2 test fled: expect %d, but got %d\n”, expect2, ret2);
}
return 0;
}
“`
2. 自動測試
自動測試需要使用一些測試框架來自動化執(zhí)行測試用例和檢查測試結(jié)果。常用的測試框架包括Google Test、CUnit等。
例如:
使用Google Test測試框架進(jìn)行自動測試
“`
#include
#include “l(fā)ibtest.h”
TEST(Func1Test, PositiveTest) {
EXPECT_EQ(5, func1(2, 3));
}
TEST(Func1Test, NegativeTest) {
EXPECT_EQ(1, func1(-2, 3));
}
TEST(Func2Test, PositiveTest) {
const char* str = “hello”;
EXPECT_EQ(5, func2(str));
}
TEST(Func2Test, NegativeTest) {
EXPECT_EQ(-1, func2(NULL));
}
int mn(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
“`
六、
動態(tài)庫接口測試是確保動態(tài)庫正確性和可靠性的重要步驟。在Linux下,我們可以使用一些工具來測試動態(tài)庫接口,包括ldd、nm、objdump和gdb等。同時,手動測試和自動測試也是動態(tài)庫接口測試的兩種常用方法,可以根據(jù)不同的需求選擇適合自己的測試方法。
相關(guān)問題拓展閱讀:
- 請教關(guān)于android linux動態(tài)庫.so的加載調(diào)用
- 如何判斷l(xiāng)inux 動態(tài)庫調(diào)用
請教關(guān)于android linux動態(tài)庫.so的加載調(diào)用
1、 .so動態(tài)庫的生成
可使用gcc或者g++編譯器生成動態(tài)庫文件(此處以g++編譯器為例)
g++ -shared -fPIC -c XXX.cpp
g++ -shared -fPIC -o XXX.so XXX.o
2、 .so動態(tài)庫的動態(tài)調(diào)用接口函數(shù)說明
動態(tài)庫的調(diào)用關(guān)系可以在需要調(diào)用動態(tài)庫的程序編譯時,通過g++的-L和-l命令來指定。例如:程序test啟動時需要加載目錄/root/src/lib中的libtest_so1.so動態(tài)庫,編譯命令可照如下編寫執(zhí)行:
g++ -g -o test test.cpp –L/root/src/lib –ltest_so1
(此處,我們重點講解動態(tài)庫的動態(tài)調(diào)用的方法,關(guān)于靜態(tài)的通過g++編譯命令調(diào)用的方式不作詳細(xì)講解,具體相關(guān)內(nèi)容可上網(wǎng)查詢)
Linux下,提供專門的一組API用于完成打開動態(tài)庫慧蘆,查找符號,處理出錯,關(guān)閉動態(tài)庫等功能。
下面對這些接口函數(shù)逐一介紹(調(diào)用這些接口時,需引用頭文件#include ):
1)dlopen
函數(shù)原型:void *dlopen(const char *libname,int flag);
功能描述:dlopen必須在dlerror,dlsym和dlclose之前調(diào)用,表示要將庫裝載到內(nèi)存,準(zhǔn)備使用。如果要裝載的庫依賴于其它庫,必須首先裝載依賴庫。如果dlopen操作失敗,返回NULL值;如果庫已經(jīng)被裝載過,則dlopen會返回同樣的句柄。
參數(shù)中的libname一般是庫的全路徑,這樣dlopen會直接裝載該文件;如果只是指定了庫名稱,在dlopen會按照下面的機(jī)制去搜尋:
a.根據(jù)環(huán)境變量LD_LIBRARY_PATH查找
b.根據(jù)/etc/ld.so.cache查找
c.查找依次在/lib和/usr/lib目錄查找。
flag參數(shù)表示處理未定義函數(shù)的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暫時不去處理未定義函數(shù),迅搜先把庫裝載到內(nèi)存,等用到?jīng)]定義的函數(shù)再說;RTLD_NOW表示馬上檢查是否存在未定義的函數(shù),若存在,則dlopen以失敗告終。
2)dlerror
函數(shù)原型:char *dlerror(void);
功能描述:dlerror可以獲得最近一次dlopen,dlsym或dlclose操作的錯誤信息,返回NULL表示無錯誤。dlerror在返回錯誤信息的同時,也會清除錯誤信息。
3)dlsym
函數(shù)原型:void *dlsym(void *handle,const char *symbol);
功能描述:在dlopen之后,庫被裝載到內(nèi)存。dlsym可以獲得指定函數(shù)(symbol)在內(nèi)前昌帶存中的位置(指針)。如果找不到指定函數(shù),則dlsym會返回NULL值。但判斷函數(shù)是否存在更好的方法是使用dlerror函數(shù),
4)dlclose
函數(shù)原型:int dlclose(void *);
功能描述:將已經(jīng)裝載的庫句柄減一,如果句柄減至零,則該庫會被卸載。如果存在析構(gòu)函數(shù),則在dlclose之后,析構(gòu)函數(shù)會被調(diào)用。
3、 普通函數(shù)的調(diào)用
此處以源碼實例說明。各源碼文件關(guān)系如下:
test_so1.h和test_so1.cpp生成test_so1.so動態(tài)庫。
test_so2.h和test_so2.cpp生成test_so2.so動態(tài)庫。
test_dl.cpp生成test_dl可執(zhí)行程序,test_dl通過dlopen系列等API函數(shù),并使用函數(shù)指針以到達(dá)動態(tài)調(diào)用不同so庫中test函數(shù)的目的。
如何判斷l(xiāng)inux 動態(tài)庫調(diào)用
創(chuàng)建靜態(tài)庫:
ar -rcs test.a *.o
查看靜態(tài)庫:
ar -tv test.a
解壓靜態(tài)庫:
ar -x test.a
查看程序依賴的動態(tài)庫:
readelf -a xxx|grep library
如:可以看到,下面的交饑賀叉程序hello執(zhí)行依賴于如下兩個動態(tài)庫。
rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep “l(fā)ibrary”
0x(NEEDED)Shared library:
0x(NEEDED)Shared library:
rebi@ubuntu:~/test$
或者跡嘩:readelf -l hello 即可。
nm xxx 查看符號
關(guān)于linux測試動態(tài)庫接口的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站設(shè)計制作選創(chuàng)新互聯(lián),專業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專注成都高端網(wǎng)站建設(shè)定制開發(fā)服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計,成都網(wǎng)站設(shè)計服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開發(fā),營銷網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
網(wǎng)站欄目:Linux下動態(tài)庫接口測試簡易指南 (linux測試動態(tài)庫接口)
文章分享:http://www.5511xx.com/article/cdespgo.html


咨詢
建站咨詢
