Linux에서 동적 링크 라이브러리 컴파일 및 사용 설명
linux 라이브러리 소개
두 가지 라이브러리
저장: 일반적으로/usr/lib 및/lib 아래에 명명된 사양: 1.정적 라이브러리의 이름은 일반적으로libxxx입니다.a, 여기서 xxx는 이lib의 이름입니다.동적 라이브러리의 이름은 일반적으로libxxx입니다.so.major.minor, xxxx는 이 동적 라이브러리의 이름이고, major는 메인 버전 번호이며, minor는 부 버전 번호이다.
실행 가능한 프로그램이 어떤 라이브러리에 의존하는지 보기 ldd 명령은 실행 가능한 프로그램이 의존하는 공유 라이브러리를 볼 수 있습니다
새로 라이브러리를 설치한 후에 어떻게 시스템에서 그를 찾을 수 있습니까?/lib 또는/usr/lib에 설치되어 있으면,ld는 기본적으로 찾을 수 있으며, 다른 조작이 필요 없습니다.다른 디렉토리에 설치하려면/etc/ld에 추가해야 합니다.so.cache 파일의 단계는 다음과 같습니다./etc/ld 편집so.conf 파일, 라이브러리 파일이 있는 디렉터리에 가입하는 경로 2.ldconfig를 실행하면/etc/ld를 다시 만듭니다.so.cache 파일
동적 링크 라이브러리 작성
헤더 파일 so.h
#ifndef SO_H
#define SO_H
int add(int a, int b);
#endif /*SO_H*/
실행 파일 so.c
#include "so.h"
int add(int a, int b)
{
return a + b;
}
동적 링크 라이브러리 컴파일
gcc -fPIC -c so.c
//생성so.o gcc -shared -o libtest.so so.o
(위의 두 줄을 한 줄로 통합할 수 있음: gcc so.c -fPIC -shared -o libtest.so
) 참고:$ nm -g libtest.so
0000000000000670 T add
0000000000201030 B __bss_start
w __cxa_finalize@@GLIBC_2.2.5
0000000000201030 D _edata
0000000000201038 B _end
0000000000000684 T _fini
w __gmon_start__
0000000000000540 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
동적 라이브러리 사용
#include
#include "so.h"
int main(int argc, char *argv[])
{
printf("%d
", add(1, 2));
return 0;
}
gcc main.c -L. -ltest -o test
를 사용하여 컴파일합니다.이 때
readelf test -d
실행 가능한 파일test를 생성한 다이나믹 섹션에서libtest에 의존하는 것을 볼 수 있습니다.쏘다$ readelf test -d
Dynamic section at offset 0xe18 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libtest.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
......
dynamic symbols에도 undefined symbol (add)
$ nm -D test
U add
0000000000601048 B __bss_start
0000000000601048 D _edata
0000000000601050 B _end
00000000004007b4 T _fini
w __gmon_start__
0000000000400578 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U __libc_start_main
U printf
스텔스 링크를 실행하기 전에 환경 변수를 설정하거나 앞에 생성된libtest를 주의해야 합니다.so 시스템 경로로 복사합니다. 그렇지 않으면 동적 라이브러리를 찾을 수 없습니다.
$ ./test
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
$ export LD_LIBRARY_PATH=.
$ ./test
3
#include
#include
int main(int argc, char *argv[])
{
void *dl = NULL;
int (*add)(int a, int b);
dl = dlopen( "./libtest.so", RTLD_LAZY);
if( dl == NULL )
{
printf("so loading error.
");
return 1;
}
add = (int(*)(int, int))dlsym(dl, "add");
if( dlerror() != NULL )
{
printf("fun load error.
");
return 1;
}
printf("%d
", add(1, 2));
return 0;
}
LD_LIBRARY_PATH
를 사용하여 컴파일합니다.이때
gcc dyn_main.c -ldl -o dyn_test
를 통해 알 수 있듯이dyn테스트는libtest에 의존하지 않습니다.so: $ readelf dyn_test -d
Dynamic section at offset 0xe18 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
......
dyn_테스트의 dynamic symbols에도 add가 없습니다.
$ nm -D dyn_test
U dlerror
U dlopen
U dlsym
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U __libc_start_main
U printf
U puts
실행 프로그램도 환경 변수를 설정할 필요가 없습니다
readelf dyn_test -d
$ ./dyn_test
3
참고 자료 Linux에서 링크 동적 라이브러리 컴파일
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.