2016-09-30 4 views
2

This in C++ :C++ 정적 라이브러리의 공유 전역 변수 : Linux

정적 라이브러리 "A"는 전역 변수 foo를 정의합니다.

"B"및 "C"는 두 다이내믹 라이브러리이다 모두 그에이어서 B 및 C는 (예와 동일한 프로세스에로드 끝

A.으로 (정적) 연결에 따라 : 어플리케이션 부하 B 및 기음).

Shared global variable in C++ static library

어떤 리눅스 환경에 대한 : 우리가 윈도우 환경에있는 경우

, 우리는 foo는 두 개의 서로 다른 인스턴스로 명확하게 여기에서 설명하는 C에서 B의 하나 하나를 얻을 것이다.

컨텍스트 : 우리는 현재 출시 될 예정

+0

답변을 얻지 못하면 전역 변수를 1 라이브러리에서 변경하고 두 번째 라이브러리에서 값을 확인하여 간단한 테스트를 수행 할 수 있습니다. –

답변

1

각 라이브러리를 리눅스 윈도우 프로젝트를 이식하는 하나가 프로세스의 모든 구성 요소에 의해 사용되는 런타임에 그러나 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_DEFAULTLSB에 따라 :

STV_DEFAULT 0 심볼의 결합 유형에 지정된대로 STV_DEFAULT 속성 심벌의 표시가된다. 즉, 전역 및 약한 기호는 구성 요소 (실행 파일 또는 공유 개체)를 정의하는 외부에서 볼 수 있습니다. 아래에 설명 된대로 지역 기호는 입니다. 전역 및 약한 기호는 선점 형입니다. 즉, 다른 구성 요소에 동일한 이름의 정의로 선점 될 수 있습니다.

man 5 elf

:

STV_DEFAULT : 기본 기호 표시 규칙. 글로브와 약한 기호는 다른 모듈에서 사용할 수 있습니다. 로컬 모듈의 참조는 다른 모듈의 정의에 의해 삽입 될 수 있습니다 ( ). SysV ABI 정보

:

참조 기호를 해결 상기 동적 링커는 너비 우선 탐색 심볼 테이블을 검사한다. 즉, 먼저 실행 파일 프로그램의 기호 표를보고 DT_NEEDED 항목 (순서대로)의 기호 표에서 다음 두 번째 수준 인 DT_ NEEDED 항목 등의 기호 표를 확인합니다.

기호에 STV_HIDDEN을 사용하면 공유 된 개체 외부에 표시되지 않습니다.

대조적으로 Windows에서 기호는 항상 주어진 DLL에서 가져오고 기호는 기본적으로 다른 DLL로 내보내지지 않습니다.

관련 문제