Отсюда ответы: > 1. почему линкер не выравнивает переменные, размера меньше чем слово, по адресу, кратному слову?
А зачем? Память лишняя что-ли?
>2. как заставить линкер производить выравнивание адреса размещения переменных внутри одного модуля по границам слова, хотя бы для ускорения доступа к этим переменным?
Каким образом это ускорит доступ? В системе команд ARM есть байтовый доступ по любому адресу.
>3. как заставить линкер производить выравнивание адреса размещения переменных при переходе к другому модулю?
Наверное, использовать атрибуты выравнивания для данных.
>4. что за херня? как эта дурацкая опция влияет на генерирование кода с невыровненным адресом переменных модулей?
Оптимизация... Экономим на всём, в том числе и памяти.
>5. предполагаю, что имеется ошибка в GCC: работающий код может думать, что переменная размещена по выровненному адресу, а реально она находится по невыровненному
Код не может думать. Думать может программист написавший его и, вероятно, допустивший ошибку. Смотрите код, работающий с этими переменными. С большой долей вероятности ошибка там.
Боюсь, что это будет очередным доказательством, что оптимизация - лучший проявитель кривого кода.