Если я компилировать код примера в нижней части сГНУ линкера (ЛД) генерирует статические переезды в общей библиотеке
arm-elf-gcc init.c -o lib.so -Wl,-shared -nostdlib
Я получаю общую библиотеку с некоторыми переездами (readelf lib.so -r):
0000032c 00000d02 R_ARM_ABS32 000004b8 plpv1
00000330 00001302 R_ARM_ABS32 00000000 lpv2
000004b8 00000b02 R_ARM_ABS32 00000000 lpv1
До сих пор я полагал, что компоновщик разрешает все статические перемещения и генерирует динамические перемещения (которые будут обрабатываться загрузчиком), где это необходимо. Почему на выходе компоновщика остались статические перестановки? This документе сказано, R_ARM_ABS32 является статическим, а также перемещение:
Статические переездов обрабатываются статическим линкера; они обычно либо полностью разрешены, либо используются для создания динамических перемещений для обработки с помощью этапа пост-связывания или динамического загрузчика. Хорошо сформированное изображение не будет иметь статических перемещений после того, как статическое соединение будет завершено, поэтому пост-линкер или динамический загрузчик обычно будет только haveto иметь дело с динамическими перемещениями.
BTW, это также может быть воспроизведено с использованием i386-elf-gcc, используемое статическое перемещение - R_386_32.
Может ли кто-нибудь сказать мне, почему и сказать, какие перестановки должны действительно обрабатываться в загрузчике? Спасибо заранее!
Пример кода:
extern unsigned char lpv1;
extern unsigned char lpv2;
unsigned char* plpv1 = &lpv1;
void func(void)
{
lpv2 = *plpv1;
}
Тот же вопрос здесь ... Любой прогресс? – Benoit