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