Заголовок программы с пометкой RWE в общем объектном файле

Я использую кросс-компилятор в 64-битной системе Linux на базе Intel, чтобы собрать часть нашего программного обеспечения, чтобы оно могло работать на 32-битном чипе PowerPC. Кросс-компилятор был произведен Crosstools.

Когда я запускаю «readelf -a» для файлов общих объектов (файлов .so), созданных кросс-компилятором, часть вывода показывает следующее:

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00000000 0x00000000 0x9a87c 0x9a87c R E 0x10000
  LOAD           0x09a87c 0x000aa87c 0x000aa87c 0x01344 0x03230 RWE 0x10000
  DYNAMIC        0x09ba84 0x000aba84 0x000aba84 0x000d0 0x000d0 RW  0x4
  GNU_EH_FRAME   0x09a7bc 0x0009a7bc 0x0009a7bc 0x0002c 0x0002c R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

Проблема в том, что заголовок имеет пометку RWE. У потенциального клиента, оценивающего наше программное обеспечение, есть проблемы с этим, и он хочет, чтобы это было просто RW.

Второй кросс-компилятор, созданный той же версией Crosstools и предназначенный для той же версии gcc, создает код для 64-битных чипов PowerPC. Файлы общих объектов, созданные этим кросс-компилятором, не создают заголовков RWE (второй заголовок LOAD помечен как RW).

Квалификаторы для gcc как для компиляций, так и для ссылок в обоих случаях одинаковы.

Я новичок в мире кросс-компиляторов и заголовков ELF. Есть ли способ заставить 32-битный кросс-компилятор создавать общие объектные файлы без заголовка с пометкой RWE?

В противном случае есть ли способ (безопасно) исправить уже созданный файл .so, чтобы изменить заголовок с пометкой RWE, чтобы он был помечен как RW?


person Douglas Coup    schedule 21.02.2018    source источник


Ответы (1)


Можете ли вы проверить сопоставление раздела с заголовком программы (eu-readelf -l)? Я почти уверен, что это происходит потому, что ваша целевая конфигурация по умолчанию не включает функцию безопасного GOT, которая была реализована для GNU/Linux некоторое время назад:

См. --bss-plt и --secure-plt в ld и PowerPC 32-разрядной поддержке ELF чтобы флаги управляли этим поведением. Если вы используете пользовательский загрузчик программ, возможно, вам придется настроить его для поддержки защищенного PLT. Динамический компоновщик glibc поддерживает это.

(И ваш покупатель очень проницателен, поздравляю.)

РЕДАКТИРОВАТЬ Если --secure-plt не работает, ваша подцель PowerPC либо несовместима с ней, либо вы неправильно построили цепочку инструментов, либо есть сценарий компоновщика, который переопределяет его действие.

person Florian Weimer    schedule 21.02.2018
comment
В нашей системе сборки нет команды eu-readelf. Я добавил --secure-plt к параметрам ссылки и -msecure-plt к параметрам компиляции. Параметры не привели к ошибкам команд, но созданные файлы .so по-прежнему имеют заголовок RWE. - person Douglas Coup; 22.02.2018