• <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <span id="wslfv"></span>
    <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <th id="wslfv"><track id="wslfv"><rt id="wslfv"></rt></track></th>

    <li id="wslfv"><acronym id="wslfv"></acronym></li>
    更多課程 選擇中心

    嵌入式培訓
    達內IT學院

    400-111-8989

    在arm-linux上編譯helloworld時候的抓狂經歷

    • 發布:嵌入式培訓
    • 來源:嵌入式問答
    • 時間:2017-11-07 11:13

    幾個月前,我(原作者)曾經編寫過一個helloworld,跑在開發板上,當時編譯和運行都很順利,所以也就沒當回事。在隨后的幾個月里,一直在研究linux底層驅動的開發,所以一直都沒有開發過上層應用程序。現在,由于想編寫一個上層應用來測試一下底層驅動程序的時候,又想再編譯一下helloworld,因此,也就開始了我無比挫折的開發helloworld程序的曲折歷程,過程無比抓狂和令人吐血,從沒想過helloworld會如此困難令人蛋疼,因此分享一下,以便更多的網友和我自己參考。

    1、編寫helloworld.c,內容包含了stdio.h頭文件,并在main函數中只調用printf函數輸出helloworld,如此簡單,和普通helloworld沒有區別。arm-linux-gcc helloworld.c -o helloworld,編譯順利完成,生成helloworld.

    2、將helloworld拷貝到開發板中,直接運行:./helloworld,輸出錯誤:permission denied. 然后調用chmod +x helloworld, ./helloworld, 然后輸出錯誤信息“-sh ./helloworld: not found”。噩夢從此開始。

    3、我認為這個not found的錯誤應該是開發板內缺少某些庫的原因,因此趕緊去找庫。查到arm-linux-elfread -a helloworld | "shared library" 可以看到程序依賴哪些庫,結果查出依賴“libc.so.6”

    4、libc.so.6是libc-2.8.so的鏈接,因此,我拷貝libc-2.8.so到開發板中,然后在開發板中手動用“ln -s libc-2.8.so libc.so.6”為庫建立了鏈接,然后,運行./helloworld,結果發現出錯信息還是“not found”。因此我再想是不是還缺少別的庫。

    5、進入ubuntu調用"arm-linux-elfread -a helloworld"這回輸出內容比較多,然后找來找去,好像里面說到一個"ld-linux-2.8.so.3",于是在開發板的/lib文件夾下ld-linux-2.8.so.2,改成了ld-linux-2.8.so.3。./helloworld,這回終于不說“not found”了,但是出錯信息又成了“error when use library libc.so.6, can't handle TLS data”。

    6、我覺得吧,以前調試helloworld真沒這么麻煩,但是沒辦法,還要繼續,我已經抓狂狀態了。沒辦法還是老老實實地把ubuntu上交叉編譯器當中的ld-2.8.so考到開發板中了,剛才沒考,然后自己創建鏈接,然后./helloworld,這回又出現了新的錯誤“segmentation fault”.然后我就又開始在網絡上搜這個問題的解決辦法。基本上毫無頭緒。

    7、我回憶以前helloworld成功的時候,還沒有自己修改和編譯內核,而且我的內核是使用arm-linux-gcc 4.3.2編譯的,但是原廠開發板應該是3.4.1編譯的,而且我的文件系統也使用的是原廠提供的文件系統,我猜會不會是內核和文件系統編譯版本不同造成的?所以,重新燒寫了原廠內核,然后再進入文件系統,運行./helloworld,但是仍然報錯,然后抓狂,然后一口黑血吐在屏幕上。

    8、回到ubuntu,修改環境變量,把arm-linux-gcc 4.3.2換成 3.4.1,重新編譯helloworld,然后考到開發板中,然后把我之前考到/lib目錄下的所有庫和相應鏈接都刪掉,保留以前系統自帶的庫,然后./helloworld,結果終于顯示出了挨千刀的 hello world!

    9、重新燒寫我自己用arm-linux-gcc 4.3.2編譯的內核,然后運行helloworld,這回仍然正常,這就證明helloworld的正常運行和文件系統的編譯方式緊密相關(文件系統是arm-linux-gcc3.4.1編譯的),而和內核的編譯器版本關系不大,起碼事實證明了這點。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:關于嵌入式(ARM)知識通俗化的理解
    下一篇:嵌入式軟件和PC軟件有何區別?
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美一级高清片,一级欧美免费大片视频,欧美三级在线电影免费 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>