亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2534 | 回復: 0
打印 上一主題 下一主題

帶版本號的符號 versioned symbol [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-09-15 15:32 |只看該作者 |倒序瀏覽
小小疏忽,折騰了我近一天的時間,不過總算弄清了個大概。
碰到幾次帶版本的符號的連接問題,令人頭疼。
終于狠下心來,花了兩天時間把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
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP