Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

compiled c program memory addresses

I am trying to understand the following:

Given a small Hello World program in C

#include <stdio.h>

int main()
{
    int i;
    for(i=0; i < 10; i++)
    {
        printf("Hello, world!\n");
    }
}

When you compile this with gcc, and then examine the resulting .out file using objdump, you get something like the following:

08048374 <main>:
8048374:       55                      push   ebp
8048375:       89 e5                   mov    ebp,esp
8048377:       83 ec 08                sub    esp,0x8
804837a:       83 e4 f0                and    esp,0xfffffff0
804837d:       b8 00 00 00 00          mov    eax,0x0
8048382:       29 c4                   sub    esp,eax
8048384:       c7 45 fc 00 00 00 00    mov    DWORD PTR [ebp-4],0x0
804838b:       83 7d fc 09             cmp    DWORD PTR [ebp-4],0x9
804838f:       7e 02                   jle    8048393 <main+0x1f>
8048391:       eb 13                   jmp    80483a6 <main+0x32>
8048393:       c7 04 24 84 84 04 08    mov    DWORD PTR [esp],0x8048484
804839a:       e8 01 ff ff ff          call   80482a0 <printf@plt>
804839f:       8d 45 fc                lea    eax,[ebp-4]
80483a2:       ff 00                   inc    DWORD PTR [eax]
80483a4:       eb e5                   jmp    804838b <main+0x17>
80483a6:       c9                      leave  
80483a7:       c3                      ret    
80483a8:       90                      nop    
80483a9:       90                      nop    
80483aa:       90                      nop    

The first column of values in the resulting .out file are memory addresses, if I understand correctly, these addresses contain the instructions that are following in the other columns.

Now my question: If you copy the file to a different machine (or a different location on the same machine even) and dump the file again these addresses should change to something else because the program will be at a different location in memory, correct? But if I do that, I get the exact same output, the same address values. Why is that? I clearly misunderstand the meaning of this first column, could somebody please explain to me what these addresses are exactly? Thanks in advance!

Update: As I understand it now, thanks to Paul R's answer and some further wikipedia reading, these addresses are referencing a virtual address space in which the code is executed by the operating system of the machine on which it runs. These virtual addresses are mapped to absolute addresses on the actual machine by its operating system.

like image 909
Asciiom Avatar asked Aug 09 '12 10:08

Asciiom


1 Answers

The addresses in the left column are the (virtual) addresses at which your code will be loaded when it's run. Unless the code is position-independent it will need to be loaded at these addresses to run correctly.

like image 94
Paul R Avatar answered Oct 01 '22 20:10

Paul R