2017-01-06 1 views
1

ld (gcc 암 임베디드 툴킷에서) 원하는 것을 수행하는 방법을 이해하는 데 어려움이 있습니다.ld가 링크 명령 파일에 지정되지 않은 섹션을 출력 파일에 포함시키는 이유는 무엇입니까?

예를 들어, 링크 할 몇 개의 .o 파일이 있습니다. 출력에 .foo 섹션이 필요하다고 말하십시오. 내가 명령 파일 link.ld에 넣고 :

SECTIONS{ 
    .foo : {*(.text)} 
} 

을 가서 "LD -T link.ld file1.o fil2.o -o output.o"

그때 내가 출력 objdump를 사용합니다. 그리고 그것은 단지 각 입력 파일()에있는 모든 섹션을 포함하고 있으며 .foo라는 섹션이 전혀 없습니다. 이것이 왜 .foo라는 출력에 섹션이 없는지 가장 혼란스러운 부분입니까?

나는 이것을 http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html으로 읽었는데 모두 똑바로 보인다. 그런 단순한 링커 스크립트가 왜 내가 원하는 것을 원하지 않는지 이해할 수 없다.

나는 분명히 뭔가 빠져 있어야합니다. 누군가 출력 파일에 나타나는 섹션과 그 섹션을 정확하게 제어 할 수있는 방법을 설명 할 수 있습니까?

답변

1

글쎄, 그렇게 쉽게 제어 할 수는 없습니다. "명시 적으로"(순서, 정렬, 위치, 채우기 등과 같은 것들을 제어 할 수있는) 일부 섹션을 링크하지 않으면 링커가 필요하다고 생각하는 모든 항목이 "그 후에"배치됩니다. 이것은 단순화되었지만 대부분 이처럼 작동합니다.

나는 링커에게 에만 요청한 섹션을 포함하도록 알릴 방법이 없다고 생각합니다. 그러나 일부 섹션을 제외하도록 지시 할 수있는 방법이 있습니다. 하지만 문제는 제외하려는 섹션에 대해 명시해야한다는 것입니다.

을 폐기

3.6.7 출력 부는 ...

특수 출력 부 이름 /DISCARD/

는 입력 섹션을 삭제하기 위해 사용될 수있다. 입력 섹션 은 출력 섹션에 할당 된 /DISCARD/이 아니며 출력 파일에 포함 된 이 아닙니다.

아마도 이런 식으로 작동할까요?

SECTIONS{ 
    .foo : {*(.text)} 
    /DISCARD/ : {*(*)} 
} 
+0

그런 다음 링커 스크립트의 포인트 것입니다 "나는 당신이 요청 만 섹션을 포함하는 링커를 알 수있는 방법이 있다고 생각하지 않는다"? 벽을 몰아 부치는 이유는 나 또한 -gc-sections -print-gc-sections을 시도하고 "사용되지 않는 섹션 제거 ..."를 출력하고이 섹션은 여전히 ​​출력에 나타납니다! 이것들은 다른 섹션과 링크/심볼이없는 섹션입니다. – Jesse

+0

또 다른 문제가 있습니다 : 가끔 무작위로 보이는 섹션이 출력 파일의 동일한 주소에서 링커 스크립트로 연속적으로 지정되는 경우가 있습니다. 이것은 LD에서 버그가 수 있도록 * 한 * : 내가 뭐하는 거지 모두는 다음과 같습니다. = 0x08000000 섹션 1 2 장 과 2 장 제 1 절 중복 끝납니다.이 말도 안되는 소리가 내 정신을 몰고 간다. 가장 간단한 장난감 예제 링커 스크립트 인이 문제를 해결하기 위해 3 일을 보냈다. – Jesse

+0

@Jesse - 링커 스크립트의 요점은 링커에게 데이터를 주문하는 법을 알려주는 코드이다. 처음에는 벡터, 변수는 RAM에 있으며이 변수의 복사본은 플래시로 사용할 수 있습니다 (초기화 용). 링커에 버그가 없습니다. 저를 믿으십시오. 출력이 예상과 일치하거나 예상치 못한 결과가 발생할 때까지 작동하고 단계별로 요소를 제거/수정하는 완벽한 링커 스크립트로 시작하십시오. 다음은 STM32F1에 대한 간단한 스크립트입니다 - https://gist.github.com/FreddieChopin/3dee4b02b0ba9b9de518f30c14caa884 (http://distortos.org/에서 생성) –

관련 문제