Я прочитал тему GCC -FPIC опция
Итак, я создал свой testlib.cpp.
int foo(int num)
{
int result;
if (num != 0)
{
result = 1;
}
else
{
result = 2;
}
return result;
}
Когда я компилирую как
g ++ -c -o testlib.o testlib.cpp
и в качестве
g ++ -fPIC -c -o testlib.o testlib.cpp
соответствующие objdumps testlib.o идентичны:
objdump -d testlib.o -M intel
testlib.o: file format elf32-i386
Disassembly of section .text:
00000000 <_Z3fooi>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 ec 10 sub esp,0x10
6: 83 7d 08 00 cmp DWORD PTR [ebp+0x8],0x0
a: 74 09 je 15 <_Z3fooi+0x15>
c: c7 45 fc 01 00 00 00 mov DWORD PTR [ebp-0x4],0x1
13: eb 07 jmp 1c <_Z3fooi+0x1c>
15: c7 45 fc 02 00 00 00 mov DWORD PTR [ebp-0x4],0x2
1c: 8b 45 fc mov eax,DWORD PTR [ebp-0x4]
1f: c9 leave
20: c3 ret
И я ожидал адреса аргументов Прыгать а также JE команды должны быть независимыми от положения при компиляции с -fPIC. Таким образом, два объекта должны быть разными. Что я не так понимаю?
-fPIC
по умолчанию в новых gcc
версии. Код не зависит от позиции даже без опции:
eb 07 jmp 1c <_Z3fooi+0x1c>
это не зависит от позиции, если смотреть на 2-байтовый код операции, даже если при разборке для ясности напечатан символ и его смещение.
Обратите внимание, что весьма вероятно, что компилятор будет генерировать независимый от позиции код для такого рода коротких переходов независимо от параметров.
Так что этот флаг сейчас не очень полезен. НО вы можете отключить PIC с -fno-PIC
переключатель.
Компилятор GCC не имеет возможности специально генерироватьзависимый код. Такая способность не имеет никакого практического смысла вообще.
Что GCC может сделать, так это на самом деле генерировать либо независимый от позиции код (с -fPIC
вариант), или «любой» код (без -fPIC
опция). Когда вы используете режим «что угодно», компилятор просто игнорирует вопросы позиционной зависимости и основывает свои решения о генерации кода на других соображениях. Это означает, что даже когда вы не запрашиваете -fPIC
вы все равно можете легко получить независимый от позиции код чисто «случайно»: поскольку так получилось, что независимый от позиции код работал лучше по другим причинам (более компактен, работает быстрее и т. д.)
Если вы хотите увидеть разницу, вам нужен более представительный пример. В вашем примере все прыжки близки к прыжкам. Они естественным образом реализуются с помощью инструкций относительного (на основе смещения) перехода. Любой разумный компилятор будет использовать такие относительные переходы в таких ситуациях. И побочным эффектом этого является то, что вы в конечном итоге получаете код, независимый от позиции, даже если вы явно не запрашивали его. Независимость от позиции в данном случае «бесплатна».
Если вы хотите наблюдать разницу, вам нужен пример, где независимость позиции не будет «бесплатной». Вам нужно что-то, что подразумевает четкий компромисс между независимостью позиции и другими важными факторами, такими как эффективность и / или размер. Если вы придумаете такой пример, вы увидите разницу в том, что -fPIC
делает.