Sunday, April 18, 2010

static library & shared library嘗試

給未來的裕翔

剛從"工程師碎碎唸"這篇部落格

看到static libraryshared library的實作介紹

首先準備三個檔案

main.c
#include "myHeader.h"
int main()
{
myFunc();
return 0;
}


myHeader.h
void myFunc();


function.c
#include <stdio.h>
void myFunc()
{
printf("this is myFunc speaking\n");
}


gcc -c main.c function.c

ar crv myLib.a function.o

(c: create   r: insert with replace   v: verbose)

gcc -o main main.o myLib.a

以上是static library

gcc -o myLib.so -shared function.c

gcc -o main main.o myLib.so

./main

./main: error while loading shared libraries: myLib.so: cannot open shared object file: No such file or directory

就算編譯成功, 執行期間還是到預設幾個位置尋找shared library

方便起見, 把myLib.so複製到/lib底下

cp myLib.so /lib

./main

./main: error while loading shared libraries: /lib/myLib.so: cannot restore segment prot after reloc: Permission denied

這是SELinux的問題, 必須修改檔案的type


chcon -t textrel_shlib_t myLib.so

cp -a myLib.so /lib

注意, 一定要加-a, 否則myLib.so複製過去後, type會被自動改掉


./main

成功!

以上是shared library

如果是使用static library

ldd main只有預設的三行

如果使用shared library

ldd main則會多一行我們自己的myLib.so

linux-gate.so.1 =>  (0x00e3a000)
myLib.so => /lib/myLib.so (0x00521000)
libc.so.6 => /lib/libc.so.6 (0x00364000)
/lib/ld-linux.so.2 (0x00342000)



No comments:

Post a Comment