看板 Programming 關於我們 聯絡資訊
"-e main" 會讓loader直接call你的main() 在執行main()的最後一行ret instruction時,stack上的caller addr恐怕不是有效的 這應該是seg fault的原因,你可以用gdb單步執行試試 由於這個binary沒有link _start(),你的main()在執行時沒有c runtime environment 這使得main()的input parameter是無效的,而return value也無意義 ※ 引述《stevenlin08 (stevens)》之銘言: : 大家好, : 以gcc -c + ld : 是為了想一步步地了解其linker'loader'libary : 而想要了解在下gcc 時它的default make file內容. : 目前,是先用 : 0. : 使用gcc -v main.c,來看其相關的 : 1. : $gcc -c main.c -o main.o : 2. : $ld main.o -e main -lc -m elf_i386 -I /lib/ld-linux.so.2 : (-lc 為printf的libary, ld-linux.so.2則為在loader時需需需的lib) : 3.雖然,可以成功的linker了. : 但在其程序行時,卻又出現了segmation fault. : 因為其在gcc -v中有太多的設定. : 不知有那些必要的.或是該如何來修正其錯誤. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.93.253
stevenlin08:所以,即是沒有c runtime environment? 114.33.197.172 05/07 22:34
juichangkuo:是的,將crt也link就不會seg fault了 203.18.50.4 05/16 13:17