2017-11-26 6 views
2

yasm을 사용하여 간단한 ELF 프로그램을 작성하려고합니다. 그러나 VMA 주소가 0이 아닌 0x1000에서 시작되도록 .TEXT 섹션을 대상으로 지정하는 방법을 알아낼 수 없습니다. START 및 ORG 지시문을 사용하여 시도했지만 이러한 경우는 타겟팅 할 때만 유효합니다. 빈, 엘프가 아니야. 이것은 yasm에서 할 수 있습니까?yasm에서 ELF32 섹션의 물리적 주소를 지정 하시겠습니까?

답변

2

일반적으로 ELF 개체에서는 가능하지 않습니다. ELF 객체는 입니다. 즉,로드 주소가 아직 수정되지 않았 음을 의미합니다. 일반적으로 링커이라는 별도의 프로그램을 사용하여 재배치를 해결하고로드 주소를 수정합니다. 링커에서 사용하는로드 주소와 해당 섹션을 배치 할 순서를 구성 할 수 있습니다. 링커 스크립트를 사용합니다.는 예를 들어, GNU 링커에 대한 간단한 링커 스크립트는 COM 파일에 적합하도록 코드를 링크 : 처음에

SECTIONS { 
    . = 0x0100; 

    .text : { 
     *(.text.startup); 
     *(.text); 
    } 

    .data : { 
     *(.data); 
     *(.rodata); 
    } 

    .bss : { 
     *(.bss); 
    } 
} 

. = 0x0100 라인 주소 0x100에서 다음 섹션 배치 링커를 알려줍니다. 비슷한 스크립트를 사용하여 코드를 0x1000에 배치 할 수 있습니다. 자세한 내용은 the manual을 참조하십시오.

+0

이것은 환경과 같은 사용자 지정 OS 용으로 제작되었습니다. 재배치 기능을 사용하지 않을 것입니다. ELF 형식에는 섹션을로드 할 위치를 알려주는 필드가 있지만 yasm에서 지정하는 방법이 없습니다. 링커 스크립트를 사용하여 ld에서 수행 할 수 있지만 ld – Earlz

+0

@Earlz를 사용하지 않아도됩니다. 링커가 모든 재배치를 해결할 때 재배치가 필요하지 않습니다. ELF 실행 파일을 링커를 사용하지 않고 직접 생성 할 수있는 어셈블러가 전혀 없다고 생각합니다. ELF는 링커와 함께 사용되기 때문에 대부분 쓸모가 없습니다. – fuz

+0

@Ellz 왜 링커를 사용하지 않아도되기를 희망 했습니까? 당신이 이것을 설명 할 수 있다면, 아마도 내가 가진 제한을 더 잘 이해할 수있을 것입니다. – fuz

관련 문제