Я использую кросс-компилятор в 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?