/ / 32-bitowy demontaż Linuksa zawiera instrukcje do następnego bajtu - linux, gcc, x86, 32bit-64bit, demontaż

32-bitowy demontaż Linuksa zawiera instrukcje do następnego bajtu - linux, gcc, x86, 32bit-64bit, demontaż

Tworzę sterownik dla 32- i 64-bitowego systemu operacyjnego Linux. Jednym z wymogów jest to, że cały kod musi być samowystarczalny bez wywołań zewnętrznych. W wersji 64-bitowej nie mam żadnych problemów, ale na 32-bitowym GCC wydaje się dodawać instrukcję wywołania do następnego bajtu. Po wyszukaniu nieco znalazłem ten link:

http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html

Czy istnieje sposób wyłączenia tego w 32-bitowym systemie Linux?

Przykład: 32-bitowy demontaż:

<testfunc>:
0: push %ebp
1: mov  %esp, %ebp
3: call 4 <test_func+0x4>
<...some operation on ebx as mentioned in the link above>

64-bitowy błąd:

<testfunc>:
0: push %rbp
1: mov  %rsp, %rbp
3: <...no call here>

W ogóle nie ma połączenia z "testfunc". Nawet wtedy, dlaczego 32-bitowy kompilator dodaje te instrukcje "połączenia"? Każda pomoc jest doceniana.

Odpowiedzi:

4 dla odpowiedzi № 1

To, co widzisz w 32-bitowym dezasemblacji, może być sposobem na uniezależnienie kodu od pozycji call przesuwa na stos adres zwrotny, który jest równy eip+ stała? W trybie 64-bitowym jest rip-relacyjne adresowanie. W wersji 32-bitowej nie ma takiego połączenia, więc to wywołanie może być symulacją adresowania instrukcji i wskaźnika.


0 dla odpowiedzi nr 2

Ta instrukcja wywołania do następnego bajtu pochodzi z profilowania funkcji dla narzędzia "gprof". Byłem w stanie pozbyć się tej instrukcji "call", usuwając opcję "-pg" z kompilacji.

Ponieważ był to sterownik, był on pobierany z konfiguracji jądra systemu Linux - CONFIG_FUNCTION_TRACER.