2011-07-29 5 views
10

How to collect data from different .a files into one array? How to keep sections in .a files with ld script?과 같은 질문을합니다. 즉, 다른 객체 파일의 요소가 링크 타임 동안 구성된 배열입니다.섹션을 GNU ld 스크립트에 주입합니다. binutils 버전 간의 스크립트 호환성.

필자의 경우 각 섹션에는 .ld_comp_array_ *라는 몇 가지 배열이 있는데, *는 배열의 이름과 일치합니다. 그럼 난 LD의 --verbose를 사용하여 기본 링커 스크립트를 가지고 (다른 배열의 요소를 혼합하지 않도록, 분류) 출력 섹션에 모든 섹션을 넣어 수정 :

KEEP (*(SORT_BY_NAME(.ld_comp_array*))) 

및 모든 작품 벌금.

이 기능을 사용하는 응용 프로그램이 다양한 플랫폼 용으로 제작 될 수 있기 때문에 상황이 조금 복잡해집니다. 지금까지 Windows AVR Xmega를 대상 플랫폼으로 사용해 보았지만 Windows 32 비트 및 Linux 32 비트 및 64 비트 단위 테스트 용이며 목록이 열려 있습니다 (새 플랫폼은 가까운 미래에 추가 될 것입니다).

그러나 각 특정 플랫폼에 대한 기본 링커 스크립트는 다른 플랫폼과 다르며 현재는 .ld_comp_array * 섹션을 수동으로 삽입합니다. 어떻게 든 자동으로 수행 할 수 있습니까? 내가 생각한 유일한 해결책은 기본 스크립트를 구문 분석하고 위의 입력 섹션 설명을 붙여 넣는 것이지만 너무 무거워 보입니다.

비교적 간단한 해결책이 없다면 수동으로 수행 할 수 있지만 로컬 버전의 ld에서 가져온 기본 스크립트가 다른 버전의 binutils에서 중단 될 수 있는지 확실하지 않습니다. 누구나 이것이 안전한지 여부를 명확히 할 수 있습니까?

자동으로 수행 할 수있는 경우, 배열이 "불변"이라고 가정 할 때 .text 섹션에 입력 섹션 스펙을 항상 "주입"해도 괜찮습니까?

답변

15

그 문제에 대한 만족스러운 해결책을 찾았습니다. GNU ld는 INSERT 옵션을 가지고있어서 외부에서 지원되는 스크립트가 기본 스크립트를 덮어 쓰지 않고 기본 스크립트에있는 일부 섹션에 상대적으로 새로운 섹션을 추가합니다.

그래서 내 경우, 링커에 전달 된 스크립트는 간단 수있는 바와 같이 : http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

: INSERT 옵션에 대한 자세한

SECTIONS 
{ 
    .rodata.ld_comp_array : 
    { 
    *(SORT_BY_NAME(.ld_comp_array*)) 
    } 
} 
INSERT AFTER .rodata;