LINUX.ORG.RU

Узнать выравнивание без запуска

 ,


1

1

Как можно наиболее просто узнать выравнивание без запуска программы на целевой платформе? Имеем в распоряжение: gcc под целевую платформу, gcc под текущую платформу, autoconf, automake. Есть конечно идея написать тестовую программу, скомпилить ее и посмотреть смещение адресов через какой-нибудь objdump, но это адское извращение. Тем более узнавать выравнивание надо автоматически. Что посоветуете?

★★★★★
Ответ на: комментарий от Pavval

Затрудняюсь пока что сказать. Теоретически да, но я не уверен в версиях конечных компиляторов.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Pavval

В принципе давай совет с с++11, может и покатит.

Dudraug ★★★★★
() автор топика

Ты про -falign-* чтоль?

devl547 ★★★★★
()
$ gcc -std=c11 -x c -c -o tmp.o - <<<'char x=_Alignof(long double);'
$ objcopy -O binary tmp.o /dev/stdout | perl -nE 'say ord'
16
$ _ 

;)

arsi ★★★★★
()
Ответ на: комментарий от wota

Нужно же. Портирование проекта с x86 на все остальное, в системе сборки генерится файл с инфой о выраванивание. Сейчас он запускается на сборочной системе, меня это не устраивает.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от wota

Все, выяснил. Компилятор вроде нормальный, то есть с11 может. Проблема решена.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

вот, чуть проще :)

$ cat alignof.c 
typedef long double my_type;

char x[] = {
    '0' + _Alignof(my_type) / 10000000 % 10,
    '0' + _Alignof(my_type) / 1000000 % 10,
    '0' + _Alignof(my_type) / 100000 % 10,
    '0' + _Alignof(my_type) / 10000 % 10,
    '0' + _Alignof(my_type) / 1000 % 10,
    '0' + _Alignof(my_type) / 100 % 10,
    '0' + _Alignof(my_type) / 10 % 10,
    '0' + _Alignof(my_type) % 10,
    '\n'
};

$ gcc -std=c11 -c alignof.c
$ objcopy -O binary alignof.o alignof.txt
$ cat alignof.txt
00000016
$ _

;)

arsi ★★★★★
()

Есть конечно идея написать тестовую программу, скомпилить ее и посмотреть смещение адресов через какой-нибудь objdump

Если что, ./configure обычно так и делает. Только не извращается с objdump, а вычисляет смещения и распечатывает их из тестовой программы.

Ignatik
()
Ответ на: комментарий от Ignatik

./configure ... вычисляет смещения и распечатывает их из тестовой программы.

осиль уже весь алфавит, а не половину! ;) «без запуска программы на целевой платформе»,- написано в ОП.

aol ★★★★★
()

но это адское извращение

Нет. Так делают в libc, и ядрах, например

Тем более узнавать выравнивание надо автоматически

Сделай автоматически.

Что посоветуете?

Погуглить «genassym» + illumos / + freebsd

anonymous
()
Ответ на: комментарий от aol

«без запуска программы на целевой платформе»,- написано в ОП.

А, тупанул что-то. Ну так в GCC для каждой платформы есть machine description файл (avr.md, i386.md и так далее), там всё и расписано, можно туда заглянуть.

Ignatik
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.