W tym poście chciałbym opisać sposób na wykonanie własnych bibliotek (shared library) w Linuxie.
Najpierw tworzymy jakąś przykładową, prostą bibliotekę:
testsl.c
- #include <stdio.h>
- #include "testsl.h"
- void TestSL_DisplayData(const int32_t data)
- {
- printf("delta %d", data);
- }
- double TestSL_CalculateDelta(const int32_t a, const int32_t b, const int32_t c)
- {
- return ((b*b) - (4*a*c));
- }
testsl.h
- #ifndef __TESTSL_h__
- #define __TESTSL_h__
- #include <stdint.h>
- void TestSL_DisplayData(const int32_t data);
- int32_t TestSL_CalculateDelta(const int32_t a, const int32_t b, const int32_t c);
- #endif // __TESTSL_h__
Po przygotowaniu plików. Należy je skompilować.
- gcc -Wall -Wextra -Werror -pedantic -fPIC -c testsl.c
Jeśli wszystko przejdzie poprawnie w folderze pojawi się plik testsl.o.
Następnie tworzymy zintegrowaną bibliotekę:
- gcc -shared -Wl,-soname,libtestsl.so -o libtestsl.so testsl.o
Teraz powinniśmy dostać w tym samym folderze plik libtestsl.so.
Po stworzonej bibliotece można przejść do przygotowania testowego pliku main:
- #include <stdio.h>
- #include <stdint.h>
- #include "testsl.h"
- int main(void)
- {
- printf("test\r\n");
- int32_t delta = TestSL_CalculateDelta(2, 7, 6);
- TestSL_DisplayData(delta);
- printf("\r\nkoniec\r\n");
- return 0;
- }
Teraz czas na jego kompilację:
- gcc -L/home/<ścieżka do folderu> -Wall -o maintest main.c -ltestsl
Można zmienić nazwę jako PWD. Jeżeli biblioteka jest w tym samym miejscu co plik main:
- gcc -L${PWD} main.c -o test2main -ltestsl
Teraz jeśli będziemy chcieli uruchomić stworzoną aplikację to wyświetlony zostanie następujący błąd:
- ./test2main: error while loading shared libraries: libtestsl.so: cannot open shared object file: No such file or directory
Wobec tego należy zdefiniować ścieżkę dla zmiennej środowiskowej. Biblioteka jest dołączana dynamicznie.
- export LD_LIBRARY_PATH=/home/<ścieżka>/cprogram_test/shared_lib_test:$LD_LIBRARY_PATH
Po ustawieniu można sprawdzić czy wszystko poszło poprawnie:
- echo $LD_LIBRARY_PATH
W odpowiedzi powinniśmy otrzymać ścieżkę, którą podaliśmy w poprzedniej komendzie.
Jeśli dane są niepoprawne, lub chcielibyśmy je zmienić, to wykorzystujemy następującą komendę:
- unset LD_LIBRARY_PATH
W celu sprawdzenia od jakich bibliotek program jest zależny, należy wywołać następującą komendę:
- linux-vdso.so.1 (0x00007ffebf34c000)
- libtestsl.so => /home/<sciezka>/libtestsl.so (0x00007feaf8116000)
- libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feaf7d25000)
- /lib64/ld-linux-x86-64.so.2 (0x00007feaf851a000)