그래서이 어셈블리 파일을 링커 스크립트를 사용하여 GNU로 어셈블하고 GNU ld로 링크합니다.링커 스크립트가 예상 바이트 수를 건너 뛰지 않습니다.
링커 스크립트 (boot.ld
) :
INPUT(boot.o)
OUTPUT(boot.out)
ENTRY(boot_start)
SECTIONS {
. = 0x7c00;
.text : { *(.text) }
.data : { *(.data) }
. = 0x7dfe;
.boot_end : { *(.boot_end) }
}
당신은 내가 파일 . = 0x7cdfe
을 수행하여 부트 로더에 필요한 정확히 512 바이트를 만들려고시피
.boot_end
에는 부팅 서명이 포함되어 있으므로 나머지 2 바이트가 채워집니다. 다음과 같이
나는 부트 로더를 만들 :
m4 boot.S | as -o boot.o
ld -T boot.ld
objcopy -O binary boot.out boot.img
boot.out
는 절대 주소로 이미 섹션을 포함하고 다 잘 보인다. .boot_end
은 0x7dfe
이고 구멍은 0으로 채워질 것으로 예상되지만, 아니요, boot.img
은 총 55 바이트입니다. 저에게 이상한 것은 파일에 부팅 서명이 포함되어 있지 않다는 것입니다. .boot_end
또는 건너 뛴 바이트가없는 .text
및 .data
일뿐입니다.
ld에서 해당 바이트를 건너 뛰려면 어떻게 이동합니까? 내 부팅 서명은 어디에 있습니까?
누락 된 부분에는 어떤 섹션 이름을 사용했으며 어떤 플래그를 설정 했습니까? ('as'로 무엇을 먹입니까?)? ELF 또는 COFF를 사용하든 관계없이 중요한 객체 형식을 사용하든 상관 없습니다. – tofro
@tofro'.boot_end'는 필자가 누락 된 부분이며, 내 질문에 쓰여진 것처럼 'as'로 조립되었습니다. ELF를 사용합니다. – Downvoter
그리고 아직도'.section' 플래그로'as '코드에서 무엇을 말하지 않았습니까? 요점은 ELF에서'.text' 나'.data'가 아닌 다른 섹션 이름을 가진 섹션 플래그가'as'에 주어지지 않는다면 그 섹션은 할당되지 않을 것입니다. '.section boot_end ','''(또는 더 많은 플래그, 예를 들어 필요한 것에 따라 실행 가능하게 만들기 위해서)'ass' 입력에서 (아마도) 알몸'.section boot_end' 지시자를 대체하려고 시도하고 다시 시도하십시오 . – tofro