gcc creating a huge executable image (RedHat 2.6.18-8.el5, x86_64, Linux)
I'm trying to figure out the mystery of the 64-bit ELF image. I wrote a hello.c little program, compiled with
% gcc hello.c -o hello
No problem. Got a "hello" executable image of size 6668 bytes. So far so good.
I really want to understand the "-Ttext" linker parameter so I repeated the compilation, this time with a linker parameter:
% gcc -Xlinker -Ttext=0x2000 hello.c -o hello
Again, a "hello" executable gets created and even runs ok, but the size of the file is roughly 2MB (2102706 to be exact.) So I go looking inside the image for some clues:
% dd bs=4092 count=256 if=hello | od -Ax -tx1z -v
The image starts with the expected ELF header. Then I found out that the ".text" segment itself was placed in offset 0x2000 in the "hello" file. The ".text" segment was followed by almost 2MB of zeroes.
What is the meaning of the -Ttext= directive? (I thought it was supposed to tell the loader that I want the ".text" segment in that specific location in physical memory, not in the file itself. I really don't care where they place it in the file.)
Did I get this wrong? Does "-Ttext=" really indicate a file offset as opposed to a physical memory address?