Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义
錯(cuò)誤如下:
`_start'被多次定義 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:(.text+0x0):第一次在此定義 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:在函數(shù)‘_start’中: (.text+0x20):對(duì)‘main’未定義的引用 collect2: error: ld returned 1 exit status問(wèn)題分析:
可以看到錯(cuò)誤信息提示,提到了一個(gè)“crt1.o”這個(gè)文件,其中crt是“C runtime library”的縮寫(xiě),其含義是“C運(yùn)時(shí)庫(kù)”。
C運(yùn)行時(shí)庫(kù)除了給我們提供必要的庫(kù)函數(shù)調(diào)用(如memcpy、printf、malloc等)之外,它提供的另一個(gè)最重要的功能是為應(yīng)用程序添加啟動(dòng)函數(shù)。C運(yùn)行時(shí)庫(kù)啟動(dòng)函數(shù)的主要功能為進(jìn)行程序的初始化,對(duì)全局變量進(jìn)行賦初值,加載用戶(hù)程序的入口函數(shù)。
從給出的錯(cuò)誤提示信息中還可以得知,在crt1.o中,有一個(gè)名為“_start”的函數(shù)。現(xiàn)在網(wǎng)上找到一份crt1.o的偽代碼:?
section .text:__start::init stack;init heap;open stdin;open stdout;open stderr;:push argv;push argc;call _main; (調(diào)用 main):destory heap;close stdin;close stdout;close stderr;:call __exit;從偽代碼可以看出,在這個(gè)_start函數(shù)中,調(diào)用了main函數(shù)。那么我們可以去修改入口函數(shù),把入口函數(shù)改成junco。
執(zhí)行下面的命令:
gcc 1.c -e junco -nostartfiles其中-e選項(xiàng)為修改函數(shù)的入口地址。-e指的就是entrance。這里把entrance指定為junco函數(shù)。-nostartfiles選項(xiàng)的作用是通知編譯器不自動(dòng)加入啟動(dòng)函數(shù)以及別的庫(kù)級(jí)別的初始化,這樣就不會(huì)調(diào)用到crt1.o中的_start函數(shù)。
另外解決方法:
采用ld鏈接器。
?
參考:
http://blog.sina.com.cn/s/blog_76a864e20101ehtp.html(以上問(wèn)題分析來(lái)自此篇文章,但是是講C語(yǔ)言的,而上面的方法也同樣適用匯編)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理解JWT(JSON Web Token
- 下一篇: Ubuntu上使用octopress+g