Bevor Ihre Anwendung geladen wird, können Sie nicht sagen, wo sie im Speicher enden wird.
Versuchen Sie, den folgenden Code:
#include <stdio.h>
int main()
{
printf("%p\n", main);
}
Kompilieren es mit gcc test.c
und mehrmals ausgeführt werden.
Meine Ergebnisse zeigen:
0x55f71f8936b0
0x5630ed7ff6b0
0x558a18eea6b0
...
So können Sie nicht sicher wissen, wo sie im Speicher enden wird. Ich glaube, das war nicht immer der Fall, und dieses Verhalten ist als Sicherheits-Ding gedacht. Ich wäre nicht überrascht, wenn ältere Kernel/Loader bei jedem Lauf die gleiche Adresse hätten. Das weiß ich allerdings nicht genau.
Natürlich objdump
werden Sie relative Adressen geben:
00000000000006b0 <main>:
Beachten Sie, dass die Ausgabe dieses Programms nicht Sie physikalischen Adressen nicht geben, sind sie immer noch virtuell.
Der Punkt ist, dass durch objdump
sind eine Verantwortung der Linker und tatsächlichen virtuellen Adressen von jeder Ausführung abgeladen Adressen gibt es wegen der loader.
Beginnen diese Adressen mit * null *? –
Nein, wenn ich es in edb starte, werden die Adressen als zweites Bild angezeigt. –
Ich denke, meine erste Frage wäre, suchen Sie eine physische oder virtuelle Adresse? Zweitens, glaube ich nicht, dass "objdump" weiß, wo der Kernel die Anwendung zur Laufzeit platziert, und noch weniger wahrscheinlich, dass sie die physikalische Adresse kennen würde. –