어셈블리에 함수 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입니다. 결과 개체 인 파일이 다른 개체 파일과 연결되어 있다면 단순히 임의의 주소로 연결될 수 있습니다.
은 정렬 정보는 어떻게 든 어셈블러에 의해 생성 된 오브젝트 파일 로 만들 것인가? 그렇다면 메커니즘은 무엇이며 어딘가에 문서화 된 입니까?
마찬가지로, 최종 바이너리는 OS가 텍스트 섹션을 가상 메모리의 적절한 기본 주소로 매핑하도록 필요한 정렬 정보 을 포함합니까?
원한다면 여기에서 Linux를 사용할 수 있습니다.
감사합니다. 이것은 내가 상상 한 것입니다. 자세한 내용을 두 가지 더 찾고 있습니다. 1. 이것이 문서화되어 있습니까? 아마도 나는 링크 된 어셈블러 문서를'.p2align'에 대해 너무 엄격하게 읽었지만, 링커에게 알려주는 내용은 에 대해 아무 말도하지 않습니다. 2. N 오브젝트 파일이 바이너리에 링크되어있을 때 비슷한 결과가 발생한다고 가정합니다. 각 섹션의 최대 정렬 제약 조건이 선택됩니까? – jacobsa