ich das Thema GCC -fPIC optiong ++ -fPIC nicht Position unabhängigen Code produzieren
Ich habe so gelesen habe meine testlib.cpp erstellt.
int foo(int num)
{
int result;
if (num != 0)
{
result = 1;
}
else
{
result = 2;
}
return result;
}
Wenn ich kompilieren als g ++ -c -o testlib.o testlib.cpp und als g ++ -fPIC -c -o testlib.o testlib.cpp den entsprechenden objdumps von TestLib .o sind identisch:
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
Und ich habe erwartet, dass die Adressen der Argumente springen und je Befehle bei der Kompilierung mit -fPIC positionsunabhängig sein. Also sollten die beiden Objdumps anders sein. Was verstehe ich falsch?
In x86 sind kurze Sprünge (<± 127 Bytes) immer positionsrelativ - ich meine, jeder Sprung im 32 Bit Modus * kann mit einer expliziten vollständigen Adresse geschrieben werden, aber dann sind es 5 Bytes statt 2, kein Assembler in seinem vernünftigen Verstand würde solch eine Anweisung ausstrahlen. –
@MatteoItalia, danke für Ihren Kommentar! Entschuldigung, ich habe es gewählt, habe aber zufällig meine Abstimmung auf meinem Smartphone rückgängig gemacht und kann es nicht erneut aufladen, da es SO verbietet. : ((( – JenyaKh
mach dir keine Sorgen, es passiert die ganze Zeit =) –