ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Суббота
19 сентября
/1036655
Топик полностью
fk0 (15.09.2020 02:31, просмотров: 90) в ответ на Вот тута чуваки разруливают только R_ARM_ABS32 и R_ARM_THB_JMP/CALL - и не рыдают. - автор: LightElf
Ты уверен, что хорошо понимаешь что они делают? По-моему у них уже PIC-бинарник. Только с динамическими релокациями. Я с контроллерами не работаю, мне сложно для thumb сказать. Но вот я взял проект собираемый в thumb и для всей кучи *.o файлов вижу там массу видов разных релокаций: 

Список релокаций из *.o файлов:

R_ARM_THM_CALL, R_ARM_THM_JUMP24, R_ARM_THM_MOVT_ABS, R_ARM_THM_MOVW_ABS_NC, R_ARM_PREL31, R_ARM_REL32, R_ARM_GOT_PREL, R_ARM_ABS32, R_ARM_TARGET1, R_ARM_TARGET2, R_ARM_TLS_GD32, R_ARM_TLS_LDO32.


Список релокаций из *.so файлов (динамические только):

R_ARM_ABS32, R_ARM_GLOB_DAT, R_ARM_JUMP_SLOT, R_ARM_RELATIVE, R_ARM_TLS_DTPMOD32.


Я допускаю что некоторые вызваны необходимости взаимодействия с ARM-кодом (собственно операционка, библиотеки). Но видно же не вооружённым взглядом, что большая часть релокаций -- данные. И в первом случае список куда больше. Хотя удивительно мал. На MIPS было больше на первый взгляд (для *.o). И Thumb здесь не видно (для второго списка, для .so), т.к. ОС работает в ARM, а не thumb.


Что я хотел сказать если ld запускать с ключиком -r (generate relocable output), то мы всё из первого списка и получим. И такой файл можно (но чертовски сложно же) полноценно релоцировать. А если делать шаред либу, то там список релокаций умышленно ограниченный.


И потом я бы не был уверен, что нужны только эти три (R_ARM_ABS32 и R_ARM_THB_JMP/CALL). Раз в документации есть остальные -- они же не просто так есть, они в каких-то случаях встречаются. Может в простых хелловордах не встречаются, а шаг влево-вправо -- получи! И у них написано, мол используется "-mword-relocations", что в принципе аналогично -fPIC. Но с чего они взяли, что она ограничивается только этими тремя релокациями? Дальше хуже, официальная документация от ARM рассматривает динамические библиотеки только в ARM-режиме. В Thumb их как бы нет. Тот же R_ARM_THB_CALL не отмечен как dynamic. T.e. здесь по факту имеем компиляторо-зависимое поведение, да ещё и для "невозможного" случая (динамическая библиотека и thumb). Имеем грязный хак... Что характеро, glibc такую либу не загрузит, а для ARM-режима там и для шаред либ куча релокаций (у MIPS меньше...): https://code.woboq.org/userspace/glibc/sysdeps/arm/dl-machine.h.html#362

[ZX]
Ответить
Ответы