각 변수에 __attribute__((aligned(1)))
을 지정하지 않고도 GCC에서 모든 전역 변수에 대한 정렬을 없애려면 어떻게합니까 (기본값 : .align 4
)?gcc의 기본 전역 변수 정렬을 지정하는 방법은 무엇입니까?
일부 아키텍처에서는 1의 배 열이 작동하지 않기 때문에 제가 요구하는 것은 보편적으로 적용하는 것이 좋습니다. CPU는 정렬되지 않은 포인터를 역 참조 할 수 없습니다. 내 경우에는 비트 i386 부트 로더를 쓰고 있고, 정렬되지 않은 포인터는 괜찮지 만 (느리지 만) 거기에있다.
소스 코드 (a.c
) : gcc -m32 -Os -S a.c
총회 출력 (a.s
) : 플래그 gcc -fpack-struct=1
모든 구조체 멤버 및 구조체의 정렬을 변경
.file "a.c"
.globl answer
.data
.align 4
.type answer, @object
.size answer, 4
answer:
.long 42
.globl answer0
.type answer0, @object
.size answer0, 4
answer0:
.long 41
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
.section .note.GNU-stack,"",@progbits
__attribute__((aligned(1))) int answer0 = 41;
int answer = 42;
함께 컴파일 예를 들어, 해당 플래그가있는 경우
,515,struct x { char a; int b; };
struct y { int v : sizeof(char) + sizeof(int) == sizeof(struct x); };
struct z { int b; };
struct x x = { 1, 1 };
int i = 42;
struct z z = { 2 };
변수 x' and
Z '에 대한 정렬을 컴파일하지만 여전히 변수 i
(int
의 종류)에 대한 .align 4
있다. 나는 또한 각각의 변수에 대해 무언가를 지정할 필요없이 int i = 42;
을 정렬하지 않는 해결책이 필요하다.
프로젝트의 링커 지시문 파일을 옵션으로 편집하고 있습니까? – Yunnosch
@Yunnosch : 예, 링커 스크립트 편집 (예 :'-Wl, -T, foo.scr')이 가능합니다. – pts
나는 무엇을하고 싶은지 잘 모르겠다. 그러나 여기서 너는 평범한 사람이다. C는 변수를 자유롭게 정렬 할 수 없습니다. '__attribute __ ((aligned (1)))'은 망가진 해킹 일 뿐이며, GCC 버그 추적기조차도이를 인정합니다. –