日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Ubuntu >内容正文

Ubuntu

Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义

發(fā)布時間:2023/12/20 Ubuntu 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

錯誤如下:

`_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):對‘main’未定義的引用 collect2: error: ld returned 1 exit status

問題分析:

可以看到錯誤信息提示,提到了一個“crt1.o”這個文件,其中crt是“C runtime library”的縮寫,其含義是“C運時庫”。

C運行時庫除了給我們提供必要的庫函數(shù)調(diào)用(如memcpy、printf、malloc等)之外,它提供的另一個最重要的功能是為應(yīng)用程序添加啟動函數(shù)。C運行時庫啟動函數(shù)的主要功能為進(jìn)行程序的初始化,對全局變量進(jìn)行賦初值,加載用戶程序的入口函數(shù)。

從給出的錯誤提示信息中還可以得知,在crt1.o中,有一個名為“_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;

從偽代碼可以看出,在這個_start函數(shù)中,調(diào)用了main函數(shù)。那么我們可以去修改入口函數(shù),把入口函數(shù)改成junco。

執(zhí)行下面的命令:

gcc 1.c -e junco -nostartfiles

其中-e選項為修改函數(shù)的入口地址。-e指的就是entrance。這里把entrance指定為junco函數(shù)。-nostartfiles選項的作用是通知編譯器不自動加入啟動函數(shù)以及別的庫級別的初始化,這樣就不會調(diào)用到crt1.o中的_start函數(shù)。

另外解決方法:

采用ld鏈接器。

?

參考:

http://blog.sina.com.cn/s/blog_76a864e20101ehtp.html(以上問題分析來自此篇文章,但是是講C語言的,而上面的方法也同樣適用匯編)

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。