2017-02-17 2 views
2

내 응용 프로그램은 외부 정적 라이브러리에있는 일부 함수를 호출합니다. 외부 정적 라이브러리를 내 응용 프로그램에 연결하면 모든 것이 작동합니다 (이 경우 GCC를 사용하고 있습니다).외부 정적 라이브러리의 세그먼트를 특정 위치에 배치하십시오.

그럼에도 불구하고 라이브러리의 텍스트, .data 및 .bss 섹션의 위치 (주소)는 링커에서 선택합니다. 링커 스크립트를 수정하여 위치를 선택/변경할 수 있지만 라이브러리의 모든 함수, 변수 등을 지정해야하므로 지루합니다. 또 다른 솔루션은 전체 부분을 다시 위치하여 링커를 수정 한 후 각 기능/변수의 섹션 속성을 배치하고,하여 외부 라이브러리를 구축하는 것입니다

. = 0x1000; /* new location */ 
KEEP(*(.text.library_function1)); 
KEEP(*(.text.library_function2)); 
[...] 

: 내 말은 무엇과 같은 뭔가. 같은 뭔가 :

/* C source file */ 
unsigned char __attribute__((section (".myLibrarySection"))) variable1[10]; 
unsigned char __attribute__((section (".myLibrarySection"))) variable2[10]; 

/* Linker script */ 
. = 0x1000; 
KEEP(*(.myLibrarySection)) 

그러나, 나는이 트릭을 사용하지 않고 전체는 .text, .data와 외부 정적 라이브러리의 .bss라고 세그먼트를 재배치 할 수 있도록하고 싶습니다. 이 GCC 툴체인을 사용 가능

. = 0x1000; 
KEEP(*(.text.library_file_name)) 

인가 :

나는 (링커 스크립트) 같은 것을하고 싶습니다

?

다른 툴체인 (IAR, Keil 등)을 사용할 수 있습니까?

답변

1

섹션 이름을 바꾸기 위해 lib를 후속 처리 할 수 ​​있습니까?

# Untested! 
TMP=`mktemp -d` 
trap "rm -rf $TMP" EXIT 
cd $TMP 
ar x path/to/your/lib.a 
for o in *.o; do 
    for s in text data bss; do 
    objcopy --rename-section .$s=.mynew$s $o 
    done 
done 
ar rcs path/to/your/lib.a *.o 
1

당신은 LD의 archive:filename 구문을 사용할 수 있습니다.

먼저 외부 라이브러리의 모든 .o 파일을 정적 라이브러리 .a 파일에 저장하십시오 (아직없는 경우). 이것이 정적 라이브러리 바이너리가 배포되는 일반적인 방법입니다.

그런 다음 링커 스크립트에 지정 :

.text.special : { 
    . = 0x1000; 
    *libspecial.a:*(.text .text.*) 
} 

.text { 
    *(.text .text.*) 
} 

와일드 카드 libspecial.a에서 오는 모든 파일을 선택하고 첫 번째 섹션에 배치합니다. 나중의 와일드 카드는 남아있는 것을 선택합니다. 일반 섹션 다음에 .text.special 섹션을 배치해야하는 경우 비슷한 방법으로 EXCLUDE_FILE 지시문을 사용할 수 있습니다.

관련 문제