g ++ -fPIC не производит позиционно-независимый код

Я прочитал тему 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. Таким образом, два объекта должны быть разными. Что я не так понимаю?

2

Решение

-fPIC по умолчанию в новых gcc версии. Код не зависит от позиции даже без опции:

eb 07                   jmp    1c <_Z3fooi+0x1c>

это не зависит от позиции, если смотреть на 2-байтовый код операции, даже если при разборке для ясности напечатан символ и его смещение.

Обратите внимание, что весьма вероятно, что компилятор будет генерировать независимый от позиции код для такого рода коротких переходов независимо от параметров.

Так что этот флаг сейчас не очень полезен. НО вы можете отключить PIC с -fno-PIC переключатель.

2

Другие решения

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

Что GCC может сделать, так это на самом деле генерировать либо независимый от позиции код (с -fPIC вариант), или «любой» код (без -fPIC опция). Когда вы используете режим «что угодно», компилятор просто игнорирует вопросы позиционной зависимости и основывает свои решения о генерации кода на других соображениях. Это означает, что даже когда вы не запрашиваете -fPICвы все равно можете легко получить независимый от позиции код чисто «случайно»: поскольку так получилось, что независимый от позиции код работал лучше по другим причинам (более компактен, работает быстрее и т. д.)

Если вы хотите увидеть разницу, вам нужен более представительный пример. В вашем примере все прыжки близки к прыжкам. Они естественным образом реализуются с помощью инструкций относительного (на основе смещения) перехода. Любой разумный компилятор будет использовать такие относительные переходы в таких ситуациях. И побочным эффектом этого является то, что вы в конечном итоге получаете код, независимый от позиции, даже если вы явно не запрашивали его. Независимость от позиции в данном случае «бесплатна».

Если вы хотите наблюдать разницу, вам нужен пример, где независимость позиции не будет «бесплатной». Вам нужно что-то, что подразумевает четкий компромисс между независимостью позиции и другими важными факторами, такими как эффективность и / или размер. Если вы придумаете такой пример, вы увидите разницу в том, что -fPIC делает.

2

По вопросам рекламы [email protected]