2013-07-24 3 views
0

Если я компилировать код примера в нижней части сГНУ линкера (ЛД) генерирует статические переезды в общей библиотеке

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; 
} 
+0

Тот же вопрос здесь ... Любой прогресс? – Benoit

ответ

0

Может кто-нибудь сказать мне, почему

Скорее всего потому, что вам не хватает -fPIC флаг во время компиляции.

+0

Использование -fPIC немного изменяет перемещение, , но даже тогда статическое перемещение (R_ARM_ABS32) остается в библиотеке. –

+0

Любые другие предложения? –