2016-12-13 5 views
0

У меня возникла проблема с компиляцией нескольких файлов PIC без таблицы глобальных смещений.Использование независимого кода позиции без GOT

При составлении первого onefile.c файла со следующими параметрами сборки не включает в себя ссылки на GOT:

рука-ни-EABI-gcc.exe first.c -nosdlib -fPIE -march = ARMv7-а -o first.o

first.c

void function(); 
int main(); 

int main() 
{ 
    void* function_pointer; 
    function_pointer = &function; 
} 

void function() 
{ 

} 

Монтаж:

.text:00008000 ; int __cdecl main(int argc, const char **argv, const char **envp) 
.text:00008000     EXPORT main 
.text:00008000 main 
.text:00008000 
.text:00008000 var_8   = -8 
.text:00008000 var_s0   = 0 
.text:00008000 
.text:00008000     STR    R11, [SP,#-4+var_s0]! 
.text:00008004     ADD    R11, SP, #0 
.text:00008008     SUB    SP, SP, #0xC 
.text:0000800C     LDR    R3, =(function - 0x8018) 
.text:00008010     ADD    R3, PC, R3 ; function 
.text:00008014     STR    R3, [R11,#var_8] 
.text:00008018     MOV    R3, #0 
.text:0000801C     MOV    R0, R3 
.text:00008020     SUB    SP, R11, #0 
.text:00008024     LDR    R11, [SP+var_s0],#4 
.text:00008028     BX    LR 
.text:00008028 ; End of function main 

Обратите внимание, что в регистре 0x8010 регистр R3 имеет адрес функции «функция» без использования GOT.

Но при разделении файла к нескольким .c и .h файлов результат меняется

рука-ни-EABI-gcc.exe twofiles1.c twofiles2.c -nostdlib -fPIE -march = ARMv7-а -o twofiles.o

twofiles1.c:

#include "twofiles1.h" 

int main() 
{ 
    void* function_pointer; 
    function_pointer = &function; 
} 

twofiles1.h:

#include "twofiles2.h" 

int main(); 

twofiles2.c:

void function() 
{ 

} 

twofiles2.h:

void function(); 

сборки:

.text:00008000 ; int __cdecl main(int argc, const char **argv, const char **envp) 
.text:00008000     EXPORT main 
.text:00008000 main 
.text:00008000 
.text:00008000 var_8   = -8 
.text:00008000 var_s0   = 0 
.text:00008000 
.text:00008000     STR    R11, [SP,#-4+var_s0]! 
.text:00008004     ADD    R11, SP, #0 
.text:00008008     SUB    SP, SP, #0xC 
.text:0000800C     LDR    R2, =(_GLOBAL_OFFSET_TABLE_ - 0x8018) 
.text:00008010     ADD    R2, PC, R2 ; _GLOBAL_OFFSET_TABLE_ 
.text:00008014     LDR    R3, =(function_ptr - 0x18054) 
.text:00008018     LDR    R3, [R2,R3] ; function 
.text:0000801C     STR    R3, [R11,#var_8] 
.text:00008020     MOV    R3, #0 
.text:00008024     MOV    R0, R3 
.text:00008028     SUB    SP, R11, #0 
.text:0000802C     LDR    R11, [SP+var_s0],#4 
.text:00008030     BX    LR 
.text:00008030 ; End of function main 

Обратите внимание, как адрес функции "функции" рассчитывается с GOT. Это то, что я хотел бы воздержаться от Есть ли какое-либо решение для достижения той же сборки, что и первый результат?

+0

Только если вы скомпилировать программу в качестве одной единицы трансляции вы можете избежать GOT. –

ответ

0

Компилятор отображает один модуль за раз, поэтому различные единицы единиц компиляции GOT используются.

О коде ПОС GCC man говорит

-fpic

Генерация позиционно-независимого кода (PIC) подходит для использования в общей библиотеке, если поддерживается для целевой машины. Такой код обеспечивает доступ ко всем постоянным адресам через глобальную таблицу смещений (GOT). Динамический загрузчик разрешает записи GOT при запуске программы (динамический загрузчик не является частью GCC, он является частью операционной системы). Если размер GOT для связанного исполняемого файла превышает максимальный размер для конкретного компьютера, вы получаете сообщение об ошибке от компоновщика, указывающее, что -fpic не работает; в этом случае перекомпилируйте с -fPIC. (Эти максимумы составляют 8k на SPARC, 28k на AArch64 и 32k на m68k и RS/6000.X86 не имеет такого предела.) Независимый от положения код требует специальной поддержки и поэтому работает только на определенных машинах. Для x86 GCC поддерживает PIC для системы V, но не для Sun 386i. Код, созданный для IBM RS/6000, всегда не зависит от положения.

Упор шахта

+0

Есть ли какой-либо удобный способ разделения файлов и по-прежнему не использовать GOT? – Halastra

+0

AFAIK нет, нет. – LPs

 Смежные вопросы

  • Нет связанных вопросов^_^