각 라이브러리를 리눅스 윈도우 프로젝트를 이식하는 하나가 프로세스의 모든 구성 요소에 의해 사용되는 런타임에 그러나 A의 사본을 포함한다.
// h.h
extern int a;
void b(void);
void c(void);
// a.c
#include "h.h"
int a = 0;
// b.c
#include <stdio.h>
#include "h.h"
void b(void)
{
printf("%i\n", a++);
}
// c.c
#include <stdio.h>
#include "h.h"
void c(void)
{
printf("%i\n", a++);
}
//main.c
#include <stdio.h>
#include "h.h"
int main()
{
b();
c();
}
#Makefile
main: libxc.so libxb.so
cc -o main main.c -L. -lxc -lxb
libxb.so:
cc -fPIC -shared a.c b.c -o libxb.so
libxc.so:
cc -fPIC -shared a.c c.c -o libxc.so
$make
$ LD_LIBRARY_PATH=. ./main
0
1
libxa.so
에서
기호 테이블 :
53: 000000000020098c 4 OBJECT GLOBAL DEFAULT 24 a
libxc.so
에서 :
53: 000000000020098c 4 OBJECT GLOBAL DEFAULT 24 a
기본 가시성 STV_DEFAULT
인 LSB에 따라 :
STV_DEFAULT
0 심볼의 결합 유형에 지정된대로 STV_DEFAULT
속성 심벌의 표시가된다. 즉, 전역 및 약한 기호는 구성 요소 (실행 파일 또는 공유 개체)를 정의하는 외부에서 볼 수 있습니다. 아래에 설명 된대로 지역 기호는 입니다. 전역 및 약한 기호는 선점 형입니다. 즉, 다른 구성 요소에 동일한 이름의 정의로 선점 될 수 있습니다.
man 5 elf
:
STV_DEFAULT
: 기본 기호 표시 규칙. 글로브와 약한 기호는 다른 모듈에서 사용할 수 있습니다. 로컬 모듈의 참조는 다른 모듈의 정의에 의해 삽입 될 수 있습니다 ( ). SysV ABI 정보
:
참조 기호를 해결 상기 동적 링커는 너비 우선 탐색 심볼 테이블을 검사한다. 즉, 먼저 실행 파일 프로그램의 기호 표를보고 DT_NEEDED
항목 (순서대로)의 기호 표에서 다음 두 번째 수준 인 DT_ NEEDED
항목 등의 기호 표를 확인합니다.
기호에 STV_HIDDEN
을 사용하면 공유 된 개체 외부에 표시되지 않습니다.
대조적으로 Windows에서 기호는 항상 주어진 DLL에서 가져오고 기호는 기본적으로 다른 DLL로 내보내지지 않습니다.
답변을 얻지 못하면 전역 변수를 1 라이브러리에서 변경하고 두 번째 라이브러리에서 값을 확인하여 간단한 테스트를 수행 할 수 있습니다. –