2014-10-02 4 views
1

어셈블리에 함수 foo을 쓰고 있는데, 여러 가지 이유 때문에 함수의 첫 번째 명령은 이진을 실행할 때 가상 메모리 내에 특정 정렬 인 주소 과 일치해야합니다. 예를 들어 아래 코드 에서 13 비트 정렬을 요청 했으므로 런타임에 함수의 주소는 이어야하며 0x2000의 배수 여야합니다.런타임시 어셈블러 정렬 지시문을 준수하도록 보장하려면 어떻게해야합니까?

은이 작업을 수행하는 자연 보인다

// The function must be aligned to 2^ALIGNMENT_BITS bytes. 
#define ALIGNMENT_BITS 13 

.text 
.p2align ALIGNMENT_BITS 
foo: 
    [...] 

그러나, GNU assembler documentation는 해당 .p2align 패드 어셈블러 내 위치 카운터, 어떤 정렬 정보 궁극적으로 바이너리로 만들 것없는 것을 말한다. 예를 들어, 파일 내의 첫 번째 지시어 인 경우, 이는 no-op입니다. 결과 개체 인 파일이 다른 개체 파일과 연결되어 있다면 단순히 임의의 주소로 연결될 수 있습니다.

  1. 은 정렬 정보는 어떻게 든 어셈블러에 의해 생성 된 오브젝트 파일 로 만들 것인가? 그렇다면 메커니즘은 무엇이며 어딘가에 문서화 된 입니까?

  2. 마찬가지로, 최종 바이너리는 OS가 텍스트 섹션을 가상 메모리의 적절한 기본 주소로 매핑하도록 필요한 정렬 정보 을 포함합니까?

원한다면 여기에서 Linux를 사용할 수 있습니다.

답변

2

ELF 오브젝트 파일 (예 : Linux)에서 섹션에있는 가장 큰 정렬 값은 섹션의 정렬로 전파됩니다. .p2align이 섹션의 다른 곳에있는 경우 동일 또한 사실이다

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   00200000 00000000 00000000 00100000 2**13 
        CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 

참고 : 예를 들어, 당신이 위에 제공된 코드를 컴파일하고 그것을 objdump -h을 실행하는 부분이 2**13의 정렬을 가지고 있음을 보여준다. 그렇지 않으면 섹션이 더 작은 양만큼 이동 된 경우 섹션 안의 맞춤을 위반하게됩니다.

+0

감사합니다. 이것은 내가 상상 한 것입니다. 자세한 내용을 두 가지 더 찾고 있습니다. 1. 이것이 문서화되어 있습니까? 아마도 나는 링크 된 어셈블러 문서를'.p2align'에 대해 너무 엄격하게 읽었지만, 링커에게 알려주는 내용은 에 대해 아무 말도하지 않습니다. 2. N 오브젝트 파일이 바이너리에 링크되어있을 때 비슷한 결과가 발생한다고 가정합니다. 각 섹션의 최대 정렬 제약 조건이 선택됩니까? – jacobsa