Premkumar <[EMAIL PROTECTED]> writes: > g++ -Wl,-emymain__Fv a.o > > Now the linker says: > /usr/lib/crt1.o(.text+0x18): In function `_start': > : undefined reference to `main' > collect2: ld returned 1 exit status > > I also tried the following > g++ -Wl,--verbose -Wl,-emymain__Fv -Wl,--defsym -Wl,start=mymain__Fv a.o > g++ -Wl,--verbose -Wl,-emymain__Fv -Wl,--defsym -Wl,_start=mymain__Fv a.o > > What mistake am I making here ?
Your understanding of what happens between execve() creating a new process and the first instruction of main, is severely lacking. You appear to think that that's where the a.out starts running. In fact, on Linux/x86, more than 10,000 instructions execute before the first instruction of main is hit. Majority of these are inside of the dynamic loader, but many others are in the "C runtime startup" crt0.o, which is added to your link line by gcc/g++ automatically. Run "nm crt0.o" -- you'll see that it defines _start and calls main. You'll need to disassemble _start to see what all the things that must be done before main on your platform. You can ask gcc not to add crt0.o (-nostdlib), and make liker set entry point to mymain(), but the result will likely crash either before or after mymain. For example, on my system: $ g++ -g junk.cpp -nostdlib -lstdc++ -lc -Wl,-emymain__Fv $ ./a.out my-main Segmentation fault (core dumped) This particular crash is happening because mymain() returns to address 0x00000001, which is actually argc, pushed onto stack by the kernel. Cheers, -- In order to understand recursion you must first understand recursion. Remove /-nsp/ for email. _______________________________________________ help-gplusplus mailing list help-gplusplus@gnu.org http://lists.gnu.org/mailman/listinfo/help-gplusplus