LINUX.ORG.RU

Переносимость адресов строковых констант

 , , ,


0

2

Есть проприетарный бинарник (позиционно-зависимый код), пишу для него графическую оболочку. Для взаимодействия используется загружаемая через LD_PRELOAD библиотека со врапперами для ioctl и printf.
На выводе много информации, которая забирается через враппер, строки форматов различаю по адресам строковых констант.
Могу ли я быть уверен, что при запуске на другой системе адреса останутся прежними (бинарник остаётся тот же, меняются только библиотеки)?
Производительность критична, так что посимвольное сравнение не годится.

★★★★★

Можешь, если это действительно константы. Можно в крайнем случае посмотреть куда эти адреса попадают (должны в .rodata бинарника) и можно убедиться через objdump -d, что обращение к этим константам идёт действительно позиционно зависимым образом, т.е. прямо по адресу.

mashina ★★★★★
()

Во всем, что касается загрузки бинарки и адресов я бы уверен не был. Хотя может я чего не знаю о загрузке бинарей...

Я бы посчитал хэши искомых строк, и сравнивал бы их (не знаю насколько это осуществимо в твоем случае).

Sectoid ★★★★★
()
Последнее исправление: Sectoid (всего исправлений: 1)
Ответ на: комментарий от mashina

А как же релокация? Я бы брал смещение от начала соответствующей секции. Только не знаю как найти эту соответствующую секцию и её начало.

anonymous
()

Я бы производил посимвольное сравнение в первый раз, а затем клал результат в какой-нибудь кеш вроде std::map<void*, T>.

vzzo ★★★
()
Ответ на: комментарий от vzzo

Поиск в первый раз не применим т.к не все строки могут потребоваться - соответственно прийдётся сравнивать всё.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от val-amart

linux-armhf и armel. Бинарник загружается через ld-linux.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от vzzo

Проще проверить. Если оно на debian и ubuntu armel armhf и с glibc от 2.15 до 2.18 будет работать, значит годится..

mittorn ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А как же релокация? Я бы брал смещение от начала соответствующей секции. Только не знаю как найти эту соответствующую секцию и её начало.

Это всё можно заранее посмотреть readelf'ом или objdump'ом. Обычно для констант позиционно зависимого бинарника их нет.

mashina ★★★★★
()
Ответ на: комментарий от redbaron

Нет, оболочку для CedarXPlayerTest.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Т.к первая строка всегда одна и та же, записываю адрес первой строки и беру смещения относительно неё.

mittorn ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.