2016-10-06 16 views
2

그래서이 어셈블리 파일을 링커 스크립트를 사용하여 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_end0x7dfe이고 구멍은 0으로 채워질 것으로 예상되지만, 아니요, boot.img은 총 55 바이트입니다. 저에게 이상한 것은 파일에 부팅 서명이 포함되어 있지 않다는 것입니다. .boot_end 또는 건너 뛴 바이트가없는 .text.data 일뿐입니다.

ld에서 해당 바이트를 건너 뛰려면 어떻게 이동합니까? 내 부팅 서명은 어디에 있습니까?

+0

누락 된 부분에는 어떤 섹션 이름을 사용했으며 어떤 플래그를 설정 했습니까? ('as'로 무엇을 먹입니까?)? ELF 또는 COFF를 사용하든 관계없이 중요한 객체 형식을 사용하든 상관 없습니다. – tofro

+0

@tofro'.boot_end'는 필자가 누락 된 부분이며, 내 질문에 쓰여진 것처럼 'as'로 조립되었습니다. ELF를 사용합니다. – Downvoter

+0

그리고 아직도'.section' 플래그로'as '코드에서 무엇을 말하지 않았습니까? 요점은 ELF에서'.text' 나'.data'가 아닌 다른 섹션 이름을 가진 섹션 플래그가'as'에 주어지지 않는다면 그 섹션은 할당되지 않을 것입니다. '.section boot_end ','''(또는 더 많은 플래그, 예를 들어 필요한 것에 따라 실행 가능하게 만들기 위해서)'ass' 입력에서 (아마도) 알몸'.section boot_end' 지시자를 대체하려고 시도하고 다시 시도하십시오 . – tofro

답변

2

섹션 플래그가 누락되었을 가능성이 높습니다. 요점은, 나중에 as에 섹션 플래그가 지정되지 않으면 비표준 (.text 또는 .data 등이 아님) 섹션 이름에 대해 ELF에 링크 할 때 섹션이 덤프에 할당되지 않습니다 (즉, 자동으로 무시됩니다

.section boot_end,"a" 
와 어셈블러의 입력 파일에 (아마도) 벌거 벗은

.section boot_end 

지침을 대체 할 coff 파일)

시도를 생성 할 때 objcopy으로이 다르게 행동주의

(예를 들어 필요에 따라 더 많은 플래그를 지정하여 실행 파일을 만들 수 있음) 다시 시도하십시오.

는 "A"플래그 섹션을 할당 가능한하게, 즉 모두 ld 및 알려줍니다 objcopy 당신이 당신의 진수를 원한다.