鏈接期和運行期的動態鏈接庫

可執行文件在查找依賴的動態鏈接庫時,是根據 /etc/ld.so.conf 和 $LD_LIBRARY_PATH 查找的。

所以,換了機器運行(如開發機和線上機),鏈接到的共享庫可能不一致。

另外,鏈接期可以hard code所要鏈接的庫的路徑。這樣,即使換了機器,運行期也會從hard code的路徑去尋找庫。


例子:

開發機上:

server.h

void fun();

server.c

#include <stdio.h>

void fun() {
  printf("server fun.");
}

server_2.c

#include <stdio.h>

void fun() {
  printf("server fun.");
  printf("server fun.");
  printf("server fun.");
  printf("server fun.");
  printf("server fun.");
  printf("server fun.\n");
}


test.c

#include "server.h"
#include "stdio.h"

int main() {
  fun();
}

命令:

gcc server.c -shared -fPIC -o libserver.so
gcc test.c -L. -lserver -o test
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"current_path"
./test
=====output: server fun.

將這些文件放到另外一臺機器上

mv libserver_2.so libserver.so
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"current_path_on_this_machine"
./test
=====output:  server fun.server fun.server fun.server fun.server fun.server fun.


另外,如果在編譯test時使用libserver.so的絕對路徑:

gcc test.c current_path/libserver.so -o test
那麼,另外一臺機器上運行時,如果 current_path 和 current_path_on_this_machine 不同,則報錯:

./test: error while loading shared libraries: current_path/libserver.so: cannot open shared object file: Permission denied



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章