Компоновщик GCC для ARM не оптимизирует размещение символов

Когда я проверяю карту памяти после компиляции, я вижу, что символы в разделе DATA или BSS не упорядочены оптимизированным образом с учетом их размера и ограничения доступа к процессору.

Например, я получаю что-то вроде:

address  size   name
0x1000      1   var_a
0x1004      4   var_b
0x1008      1   var_c
0x100a      2   var_d
0x100c      4   var_e
0x1010      1   var_f
0x1014      4   var_g
0x1018      0   end

вместо получения:

0x1000      4   var_b
0x1004      4   var_e
0x1008      4   var_g
0x100c      2   var_d
0x100e      1   var_a
0x100f      1   var_c
0x1010      1   var_f
0x1011      0   end

Однако я вижу, что все символы перепутаны и не связаны с их порядком в источнике или во время компиляции.

Я использую параметры -Os -flto -flto -fuse-linker-plugin -flto-report -flto-compression-level=9. GCC для ARM - это arm-none-eabi-gcc v4.8.3 от https://launchpad.net/gcc-arm-embedded а ld - это v2.23.2.

Есть ли какая-либо соответствующая причина, по которой ld не выполняет эту оптимизацию? Как я могу изменить порядок символов, чтобы улучшить использование памяти?


person calandoa    schedule 26.08.2015    source источник


Ответы (1)


Это можно сделать с помощью SORT_BY_ALIGNMENT в скрипте компоновщика, например:

*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.data*)))

Также есть следующие варианты, хотя я их не пробовал:

--sort-common [=ascending|descending]
    Sort common symbols by alignment [in specified order]
 --sort-section name|alignment
    Sort sections by name or maximum alignment
person calandoa    schedule 02.09.2015