Заголовок программы помечен 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?

1 ответ

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

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

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

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

Другие вопросы по тегам