부트 로더는 2 단계로 구분됩니다. 첫 번째 스테이지는 어셈블리로 작성되고 두 번째 스테이지는 두 번째 스테이지 만 C에로드됩니다. Stage1은 C에서 0x0500 : 0 주소로 코드를로드하고 거기서 점프합니다. Stage2는 "hello message"를 작성하고 중지해야합니다. 어쩌면 내가 삭제 shouldt objcopy의 somethnig으로 삭제원시 이진 파일을 실행하기위한 시작 주소 설정
cc -nostartfiles -nostdlib -c stage2.c
ld -s -T scrptfile.ld stage2.o /* I'm using ld just to set starting address of executable */
objcopy -O binary stage2 stage2.bin /* delete all unuseful data */
링커 스크립트
SECTIONS
{
. = 0x0500;
.text : { *(.text)}
.data : { *(.data)}
.bss : { *(.bss)}
}
을 (그러나 아무것도 일하지) :
내가 만든 원시 이진에 시작 주소를 설정하는 여러 가지 방법을 시도했다.어떻게하면이 stage2.bin을 실행할 수 있습니까?
원시 바이너리가 16 비트 만 허용 할 때 32 비트 길이 명령어를 사용하여 작성된 C 코드를 이해합니까?
P. 매개 변수 -set-start (objcopy)가 오류를 반환합니다. 잘못된 bfd 대상입니다. 출력 파일이 바이너리이기 때문입니까?
답변 해 주셔서 감사합니다.
링커 스크립트를 보여줄 수 있습니까? 코드를 분해하면 코드가 합리적으로 보입니까? –