2015-01-02 10 views
-2

this question을 읽은 후 주 응답으로 커널에서 readelf를 실행하고 내 .text 섹션이 0x00101000이 아니라 0x00100000임을 확인했습니다. 또한 .text 섹션이 있어야하는 위치에있는 .not.gnu.build-i를 읽는 위의 섹션을 발견했습니다. .text 섹션을 올바른 위치에 만들 수있는 방법이 있습니까? 이미 align 4을 사용하여 1M으로 설정했습니다.GRUB 멀티 부트 헤더를 찾을 수 없음

답변

0

링커 스크립트 (다른 ​​질문과 같음)가 문제입니다. 섹션을 4k로 정렬하고 multiboot을 별도의 섹션에 넣으면 4k가 할당되므로 .text이 시작됩니다. 당신의 문제를 일으키는 1M + 4k 오프셋에서. 다음으로 변경 :

SECTIONS 
{ 
    . = 1M; 

    .text ALIGN(4K) : 
    { 
     *(.multiboot) 
     *(.text) 
    } 

[snip] 
1

문제는 (하나가 생성 된 경우) LD (또는 LD GCC를 통해) 자동으로 첫 번째 4K의 노트 섹션을 배치된다는 점이다. 최종 커널을 GCC으로 연결하는 경우 -Wl,--build-id=none 옵션을 전달하십시오. LD을 사용하여 최종 바이너리를 직접 연결 한 경우 --build-id=none으로 전달할 수 있습니다.

멀티 부트 ELF 개체를 작성하는 경우이 추가 섹션이 존재하면 mulitboot 헤더가 파일의 8k 위치를 넘을 수 있습니다. 이것은 ELF 헤더가 보통 파일의 처음 4k를 취하는 것을 고려한 것입니다. .note.gnu.build-id.multiboot 섹션의 4k를 추가하면 실제 파일의 8k를 넘습니다. 이렇게하면 GRUB과 같은 멀티 부트 로더가 ELF 실행 파일이 파일의 처음 8k 만 훑어보기 때문에 멀티 부팅 헤더가 없다고 생각할 수 있습니다.