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

歡迎訪問 生活随笔!

生活随笔

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

linux

在64位linux下编译32位程序

發(fā)布時間:2025/7/14 linux 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在64位linux下编译32位程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一般情況下我們最好是在一個平臺上編譯本平臺的二進制程序,比如在32位平臺上編譯32位程序而在64位平臺上編譯64位程序。

?? 現(xiàn)在64位的系統(tǒng)(這里主要指x86_64系統(tǒng),包括AMD64和Intel的EM64T)已經(jīng)開始廣泛的使用起來了,甚至于你現(xiàn)在要是想買32位的處理器根本就沒有。64位的系統(tǒng)在性能和處理能力上相對32位系統(tǒng)也都有很大的提高。所以現(xiàn)在很多用戶已經(jīng)選擇使用64位的系統(tǒng)了。

??? 有一些軟件,在安裝過程中需要對部分代碼進行編譯以便在不同的發(fā)布版本都可以很好的運行。那么當(dāng)我們在64位系統(tǒng)上安裝32位的軟件時,它的編譯就會出錯,因為軟件的二進制部分是32位的,但是編譯出來的部分是64位的,所以我們就需要讓我們的64位系統(tǒng)可以編譯32位的程序,并且需要默認(rèn)就是編譯32位的程序。

?? 通過查閱資料,發(fā)現(xiàn)可以使用-m32來使得gcc編譯32位程序(在x86_64系統(tǒng)上),使用-m elf_i386參數(shù)可以使得64位的ld能夠兼容32位的庫,但是編譯時是使用自己的一個命令,所以沒有辦法給他加參數(shù),但是這個命令也是要調(diào)用gcc和ld得,所以我們可以通過修改gcc和ld來解決,也就是將上述的兩個支持32位編譯連接的參數(shù)默認(rèn)給加上去:

?

將/usr/bin/gcc和/usr/bin/ld都改名為*.bin,就是改為: /usr/bin/gcc.bin和/usr/bin/ld.bin

然后寫兩個腳本:

/usr/bin/gcc:

?

[plain]?view plaincopy
  • #!/bin/sh??
  • ??
  • gcc.bin?-m32?$@??
  • ?


    /usr/bin/ld:

    ?

    [plain]?view plaincopy
  • #!/bin/sh??
  • ??
  • ld.bin?-m?elf_i386?$@??
  • ?

    ? 這樣就保證調(diào)用時將需要的參數(shù)加上,然后再調(diào)用真正的參數(shù)($@表示當(dāng)前命令的所有參數(shù),也就是把傳給教本的所有參數(shù)再傳給真正的命令),經(jīng)測試可以解決問題。

    可以用一個簡單的C代碼測試一下:

    ?

    [cpp]?view plaincopy
  • /*?test.c?*/??
  • #include?<stdio.h>??
  • int?main()??
  • {??
  • ????printf("sizeof?long?is?%d\n",?sizeof(long));??
  • ????return?0;??
  • }??
  • [plain]?view plaincopy
  • $?gcc?test.c??
  • $?file?a.out??
  • a.out:?ELF?64-bit?LSB?executable?...??
  • $?./a.out??
  • sizeof?long?is?8??
  • ?? 32位編譯執(zhí)行結(jié)果 (在64位系統(tǒng)編譯32位程序需要給 GCC 加 -m32 參數(shù)):

    ?

    ?

    [plain]?view plaincopy
  • $?gcc?-m32?test.c??
  • $?file?a.out??
  • a.out:?ELF?32-bit?LSB?executable?...??
  • $?./a.out??
  • sizeof?long?is?4??

  • 另外說明下在ubuntu上如果要用 -m32 參數(shù)就要安裝如下的庫:

    ?

    ?

    [plain]?view plaincopy
  • $?sudo?apt-get?install?build-essential?module-assistant??
  • $?sudo?apt-get?install?gcc-multilib?g++-multilib??

  • ?

    如果每次在32位編譯和64位編譯之間切換的時候都要用mv指令移動,會很麻煩,可以用如下腳本來完成:

    如果要64位編譯那么就用gcc64.sh

    ?

    [plain]?view plaincopy
  • #!/bin/sh??
  • ??
  • mv?-i?/usr/bin/gcc?/usr/bin/gcc.sh??
  • mv?-i?/usr/bin/ld??/usr/bin/ld.sh??
  • ??
  • mv?-i?/usr/bin/gcc.bin?/usr/bin/gcc??
  • mv?-i?/usr/bin/ld.bin??/usr/bin/ld??

  • 如果用32位編譯那么就用gcc32.sh:

    ?

    ?

    [plain]?view plaincopy
  • #!/bin/sh??
  • ??
  • mv?-i?/usr/bin/gcc?/usr/bin/gcc.bin??
  • mv?-i?/usr/bin/ld??/usr/bin/ld.bin??
  • ??
  • mv?-i?/usr/bin/gcc.sh?/usr/bin/gcc??
  • mv?-i?/usr/bin/ld.sh??/usr/bin/ld??


  • 參考鏈接:

    http://blog.sina.com.cn/s/blog_542ecc79010007gh.html


    轉(zhuǎn)載于:https://www.cnblogs.com/zzdbullet/p/9634865.html

    總結(jié)

    以上是生活随笔為你收集整理的在64位linux下编译32位程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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