- 論壇徽章:
- 0
|
小小疏忽,折騰了我近一天的時間,不過總算弄清了個大概。
碰到幾次帶版本的符號的連接問題,令人頭疼。
終于狠下心來,花了兩天時間把info ld Scripts看了一遍,感覺大有長進。
突然有股沖動,想譯完ld script部分。
帶版本號的符號
E-mail: zhanglei@sict.ac.cn
*難免有錯誤,歡迎指導*
內容簡介
---------
0 前提
1 帶版本號的符號的定義
2 連接到帶版本的符號
3 GNU擴充
4 我的疑問
5 英文搜索關鍵字
6 我的參考
帶版本號的符號
E-mail: zhanglei@sict.ac.cn
*難免有錯誤,歡迎指導*
內容簡介
---------
0 前提
1 帶版本號的符號的定義
2 連接到帶版本的符號
3 GNU擴充
4 我的疑問
5 英文搜索關鍵字
6 我的參考
0. 前提
-- 只限于ELF文件格式
-- 以下討論用gcc
1. 帶版本號的符號的定義(共享庫內)
文件b.c內容如下,
int old_true()
{
return 1;
}
int new_true()
{
return 2;
}
寫連接器的版本控制腳本,本例中為b.lds,內容如下
VER1.0{
new_true;
};
VER2.0{
};
$gcc -c b.c
$gcc -shared -Wl,--version-script=b.lds -o libb.so b.o
可以在{}內填入要綁定的符號,本例中new_true符號就與VER1.0綁定了。
那么如果有一個應用程序連接到該庫的new_true符號,那么它連接的就是VER1.0版本的new_true符號
如果把b.lds更改為,
VER1.0{
};
VER2.0{
new_true;
};
然后在生成libb.so文件,在運行那個連接到VER1.0版本的new_true符號的應用程序,可以發(fā)現(xiàn)該應用程序不能運行了,
因為庫內沒有VER1.0版本的new_true,只有VER2.0版本的new_true。
2. 連接到帶版本的符號
寫一個簡單的應用(名為app)連接到libb.so,應用符號new_true
假設libb.so的版本控制文件為,
VER1.0{
};
VER2.0{
new_true;
};
$ nm app | grep new_true
U new_true@@VER1.0
$
用nm命令發(fā)現(xiàn)app連接到VER1.0版本的new_true
3. GNU的擴充
它允許在程序文件內綁定 *符號* 到 *帶版本號的別名符號*
文件b.c內容如下,
int old_true()
{
return 1;
}
int new_true()
{
return 2;
}
__asm__( ".symver old_true,true@VER1.0" );
__asm__( ".symver new_true,true@@VER2.0" );
其中,帶版本號的別名符號是true,其默認的版本號為VER2.0
供連接器用的版本控制腳本b.lds內容如下,
VER1.0{
};
VER2.0{
};
版本控制文件內必須包含版本VER1.0和版本VER2.0的定義,因為在b.c文件內有對他們的引用
****** 假定libb.so與app.c在同一目錄下 ********
以下應用程序app.c連接到該庫,
int true();
int main()
{
printf( "%d
", true );
}
$ gcc app.c libb.so
$ LD_LIBRARY_PATH=. ./app
2
$ nm app | grep true
U true@@VER2.0
$
很明顯,程序app使用的是VER2.0版本的別名符號true,如果在b.c內沒有指明別名符號true的默認版本,
那么gcc app.c libb.so將出現(xiàn)連接錯誤,提示true沒有定義。
也可以在程序內指定特定版本的別名符號true,程序如下,
__asm__( ".symver true,true@VER1.0" );
int true();
int main()
{
printf( "%d
", true );
}
$ gcc app.c libb.so
$ LD_LIBRARY_PATH=. ./app
1
$ nm app | grep true
U true@VER1.0
$
顯然,連接到了版本號為VER1.0的別名符號true。其中只有一個@表示,該版本不是默認的版本
我的疑問:
版本控制腳本文件中,各版本號節(jié)點之間的依賴關系
英文搜索關鍵字:
.symver
versioned symbol
version a shared library
參考:
info ld, Scripts node
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/7038/showart_47749.html |
|