assembly - How does the linker find the main function? -
how linker find main function in x86-64 elf-format executable?
a generic overview, linker assigns address block of code identified symbol main
. symbols in object files.
actually, doesn't assign real address assigns address relative base translated real address loader when program executed.
the actual entry point not main
symbol in crt calls main. ld default looks symbol start
unless specify something different.
the linked code ends in .text
section of executable , (very simplified):
address | code 1000 somefunction ... 2000 start 2001 call 3000 ... 3000 main ...
when linker writes elf header specify entry point address 2000.
you can relative address of main
dumping contents of executable objdump
. actual address @ runtime can read symbol funcptr ptr = main;
funcptr
defined pointer function signature of main
.
typedef int (*funcptr)(int argc, char* argv[]); int main(int argc, char* argv[]) { funcptr ptr = main; printf("%p\n", ptr); return 0; }
the address of main correctly resolved regardless if symbols have been stripped since linker first resolve symbol main
relative address.
use objdump this:
$ objdump -f funcptr.exe funcptr.exe: file format pei-i386 architecture: i386, flags 0x0000013a: exec_p, has_debug, has_syms, has_locals, d_paged start address 0x00401000
looking main
specifically, on machine this:
$ objdump -d funcptr.exe | grep main 40102c: e8 af 01 00 00 call 4011e0 <_cygwin_premain0> 401048: e8 a3 01 00 00 call 4011f0 <_cygwin_premain1> 401064: e8 97 01 00 00 call 401200 <_cygwin_premain2> 401080: e8 8b 01 00 00 call 401210 <_cygwin_premain3> 00401170 <_main>: 401179: e8 a2 00 00 00 call 401220 <___main> 004011e0 <_cygwin_premain0>: 004011f0 <_cygwin_premain1>: 00401200 <_cygwin_premain2>: 00401210 <_cygwin_premain3>: 00401220 <___main>:
note on windows using cygwin results differ slightly. looks main
lives @ 00401170
me.
Comments
Post a Comment