精华内容
下载资源
问答
  • 如何64位Linux系统编译32位程序

    千次阅读 2019-12-18 17:26:04
    查找GCC文档可知,编译64位程序使用-m64选项,例如: gcc -m64 -O3 index.c -o index 编译32位程序使用-m32选项,例如: gcc -m32 -O3 index.c -o index 但是如果编译32位系统报如下错误: /usr/bin/ld: skipping ...

    在64位的ubuntu,GCC8.2.0的系统上,如何编译一个32的程序?
    查找GCC文档可知,编译64位程序使用-m64选项,例如:

    gcc -m64 -O3 index.c -o index   //该程序只能在64位机器上运行
    

    编译32位程序使用-m32选项,例如:

    gcc -m32 -O3 index.c -o index   //该程序可以在32位或64位机器上运行
    

    但是如果编译32位系统报如下错误:

    /usr/bin/ld: skipping incompatible /home/zgl/gcc-8.2.0-exe/lib/gcc/x86_64-pc-linux-gnu/8.2.0/libgcc.a when searching for -lgcc
    /usr/bin/ld: cannot find -lgcc
    /usr/bin/ld: cannot find -lgcc_s
    collect2: error: ld returned 1 exit status
    

    此时可能有两个原因:第一是你安装GCC时../configure配置里面使用了--disable-multilib,导致没有安装系统库,第二个原因可能是你安装的gcc-multilib、g++-multilib库版本和你的gcc版本不匹配。

    尝试1:

    // 比如我gcc-8.2.0版本,使用如下命令安装multilib的话是安装的gcc-8.3.0版本
    // 有些情况是,安装完成之后,系统自带的gcc能使用-m32了,但是自己安装的gcc还是不能使用
    apt-get install gcc-multilib g++-multilib
    或者
    apt-get install gcc-8-multilib g++-8-multilib
    // 使用apt-get install gcc-8.2-multilib g++-8.2-multilib是不行的
    

    尝试2:
    修改usr/bin/gcc/usr/bin/ld,强制加入m32信息

    经过尝试了以上方式,我的问题依然没有解决,于是我删除了GCC-8.2.0重新安装让它支持multilib,安装命令如下:

    // 1.下载源码、解压
    wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.2.0/gcc-8.2.0.tar.gz
    wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/gmp-6.1.0.tar.bz2
    wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/mpc-1.0.3.tar.gz
    wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/mpfr-3.1.4.tar.bz2
    tar xzvf gcc-8.2.0.tar.gz
    tar -jxvf gmp-6.1.0.tar.bz2
    tar -xzvf mpc-1.0.3.tar.gz
    tar -jxvf mpfr-3.1.4.tar.bz2
    mv gmp-6.1.0 gcc-8.2.0/
    mv mpc-1.0.3 gcc-8.2.0/
    mv mpfr-3.1.4 gcc-8.2.0/
    cd gcc-8.2.0/
    // 2.建立软连接
    ln -s gmp-6.1.0/ gmp
    ln -s mpc-1.0.3/ mpc
    ln -s mpfr-3.1.4/ mpfr
    // 3.建立编译目录
    mkdir gcc-build
    cd gcc-build/
    // 4.配置configure  此时使用 --enable-multilib安装
    ../configure CFLAGS="-g3 -gdwarf-2 -O0" CXXFLAGS="-g3 -gdwarf-2 -O0" CFLAGS_FOR_TARGET="-g3  -gdwarf-2 -O0" CXXFLAGS_FOR_TARGET="-g3 -gdwarf-2 -O0" --enable-multilib --enable-languages=c,c++,fortran --prefix=/home/zgl/gcc-8.2.0-exe
    // 5.编译安装
    make -j 32
    make install
    

    安装完成之后我再source gcc,执行gcc -m32 -O3 index.c -o index便能成功了。

    References:

    展开全文
  • X86_64 的 Redhat / Centos / Scientific 下面,若要编译、运行32程序,需要安装以下包: yum install libgcc.i686 yum install glibc-static.i686 yum install glibc-devel.i686 2. 编译器需要添加选项 gcc -...

    1. 安装需要的库

    X86_64 的 Redhat / Centos / Scientific 下面,若要编译、运行32位程序,需要安装以下包:

    yum install libgcc.i686
    yum install glibc-static.i686
    yum install glibc-devel.i686

    2. 编译器需要添加选项

    gcc -m32 -c qljt.c

    qljt.c 就会以32bit 的模式编译了,。

    3. 链接的时候有时候会提示没有 -lstdc++

    原因: 其实就是 stdc++ 的版本不对;

    解决办法:
     1、执行命令: yum whatprovides libstdc++.so.6
     
    然后会提示哪个安装包有这个库文件如下:
     
    [root@localhost ~]# yum whatprovides libstdc++.so.6
     Loaded plugins: aliases, changelog, downloadonly, fastestmirror, kabi, presto, refresh-packagekit, security, tmprepo, verify,
                  : versionlock
     Loading support for CentOS kernel ABI
     Loading mirror speeds from cached hostfile
      * base: centos.ustc.edu.cn
      * centosplus: centos.ustc.edu.cn
      * contrib: centos.ustc.edu.cn
      * extras: centos.ustc.edu.cn
      * updates: centos.ustc.edu.cn
     libstdc++-4.4.7-3.el6.i686 : GNU Standard C++ Library
     Repo        : base
     Matched from:
     Other      : libstdc++.so.6[root@localhost app]# yum whatprovides libstdc++.so.6
    Loaded plugins: fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
     * base: mirrors.opencas.cn
     * extras: mirrors.pubyun.com
     * updates: mirrors.skyshe.cn
    libstdc++-4.8.5-4.el7.i686 : GNU Standard C++ Library
    Repo        : base
    Matched from:
    Provides    : libstdc++.so.6

    2、然后执行:

     [root@localhost app]# yum install libstdc++-4.8.5-4.el7.i686
    --------------------- 

    ubuntu环境参考

    https://blog.csdn.net/XscKernel/article/details/38045783

    展开全文
  • 原文地址: GDC注:我使用的方法是方法一,具体为 ...首先需要安装32的兼容库 ...1.用linux32命令在configure时改一下CHOST,设置一下编译环境 $ linux32 ./configure #系统类型将变为:i686-pc-lin

    原文地址:http://blog.chinaunix.net/uid-20109107-id-86319.html


    GDC注:因为需要解决在linux64机上编译32位的mongodb(没办法,因为编译的php是32位,然后我想将mongdb扩展添加到php中),在网上搜了很多文章,感觉这篇好懂,而且好用。我使用的是方法一,具体为:

    > linux32 ./configure --with-php-config=/usr/local/php/bin/php-config

    > export CFLAGS="-m32 -04 -march=i386 -mtune=i386"

    > make

    make成功后,用file命令看一下modules目录下的生成的mongo.so。输出为“ELF 32-bit LSB shared object”。哈哈,成功!


    方法一:
    首先需要安装
    32位的兼容库

    apt-get install ia32-libs libc6-dev-i386 linux32

    1.
    linux32命令在configure时改一下CHOST,设置一下编译环境

    $ linux32 ./configure

    #
    系统类型将变为:i686-pc-linux-gnu
    #
    而不是x86_64-unknown-linux-gnu

    2.
    设定GCC的参数
    export CFLAGS="-m32  
    -march=i386 -mtune=i386"
    export CFLAGS="-m32 -04 -march=i386 -mtune=i386"

    #最关键是-m32

    -m32, -m64
    Generate code for a 32-bit or 64-bit environment. The 32-bit environment sets int, long and pointer to 32 bits and generates code that runs on any i386 system. The 64-bit environment sets int to 32 bits and long and pointer to 64 bits and generates code for AMD's x86-64 architecture.

    方法二:

    修改/usr/bin/gcc ld,强制加入m32信息

    将gcc,ld重命名为gcc.64,ld.64

    /usr/bin/gcc

    #!/bin/sh

    gcc.64 –m32 $@

     

    /usr/bin/ld

    #!/bin/sh

    ld.64 –m elf_i386 $@


    展开全文
  • 使用 GCC 在单一的构建机器上来为不同的 CPU 架构交叉编译二进制文件。...典型的编译目标包括 32 64 的 x86 和 ARM。你可以在不同的物理或虚拟机器上完成你的构建,但这需要你为何几个系统。作为代替,你可...
    a93c2b40dbc6a99e1d82861a41ee6d6f.png使用 GCC 在单一的构建机器上来为不同的 CPU 架构交叉编译二进制文件。-- Seth Kenlon

    如果你是一个开发者,要创建二进制软件包,像一个 RPM、DEB、Flatpak 或 Snap 软件包,你不得不为各种不同的目标平台编译代码。典型的编译目标包括 32 位和 64 位的 x86 和 ARM。你可以在不同的物理或虚拟机器上完成你的构建,但这需要你为何几个系统。作为代替,你可以使用 GNU 编译器集合 (GCC) 来交叉编译,在单一的构建机器上为几个不同的 CPU 架构产生二进制文件。

    假设你有一个想要交叉编译的简单的掷骰子游戏。在大多数系统上,以 C 语言来编写这个相对简单,出于给添加现实的复杂性的目的,我以 C++ 语言写这个示例,所以程序依赖于一些不在 C 语言中东西 (具体来说就是 iostream)。

    #include <iostream>#include <cstdlib>using namespace std;void lose (int c); void win (int c); void draw (); int main() { int i; do { cout << "Pick a number between 1 and 20: \n"; cin >> i; int c = rand ( ) % 21; if (i > 20) lose (c); else if (i < c ) lose (c); else if (i > c ) win (c); else draw (); } while (1==1); }void lose (int c ) { cout << "You lose! Computer rolled " << c << "\n"; }void win (int c ) { cout << "You win!! Computer rolled " << c << "\n"; }void draw ( ) { cout << "What are the chances. You tied. Try again, I dare you! \n"; }

    在你的系统上使用 g++ 命令编译它:

    $ g++ dice.cpp -o dice

    然后,运行它来确认其工作:

    $ ./dicePick a number between 1 and 20:[...]

    你可以使用 file 命令来查看你刚刚生产的二进制文件的类型:

    $ file ./dicedice: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamicallylinked (uses shared libs), for GNU/Linux 5.1.15, not stripped

    同样重要,使用 ldd 命令来查看它链接哪些库:

    $ ldd dicelinux-vdso.so.1 =&gt; (0x00007ffe0d1dc000)libstdc++.so.6 =&gt; /usr/lib/x86_64-linux-gnu/libstdc++.so.6(0x00007fce8410e000)libc.so.6 =&gt; /lib/x86_64-linux-gnu/libc.so.6(0x00007fce83d4f000)libm.so.6 =&gt; /lib/x86_64-linux-gnu/libm.so.6(0x00007fce83a52000)/lib64/ld-linux-x86-64.so.2 (0x00007fce84449000)libgcc_s.so.1 =&gt; /lib/x86_64-linux-gnu/libgcc_s.so.1(0x00007fce8383c000)

    从这些测试中,你已经确认了两件事:你刚刚运行的二进制文件是 64 位的,并且它链接的是 64 位库。

    这意味着,为实现 32 位交叉编译,你必需告诉 g++ 来:

    1. 产生一个 32 位二进制文件2. 链接 32 位库,而不是 64 位库

    设置你的开发环境

    为编译成 32 位二进制,你需要在你的系统上安装 32 位的库和头文件。如果你运行一个纯 64 位系统,那么,你没有 32 位的库或头文件,并且需要安装一个基础集合。最起码,你需要 C 和 C++ 库(glibc 和 libstdc++)以及 GCC 库(libgcc)的 32 位版本。这些软件包的名称可能在每个发行版中不同。在 Slackware 系统上,一个纯 64 位的带有 32 位兼容的发行版,可以从 Alien BOB 提供的 multilib 软件包中获得。在 Fedora、CentOS 和 RHEL 系统上:

    $ yum install libstdc++-*.i686$ yum install glibc-*.i686$ yum install libgcc.i686

    不管你正在使用什么系统,你同样必须安装一些你工程使用的 32 位库。例如,如果你在你的工程中包含 yaml-cpp,那么,在编译工程前,你必需安装 yaml-cpp 的 32 位版本,或者,在很多系统上,安装 yaml-cpp 的开发软件包(例如,在 Fedora 系统上的 yaml-cpp-devel)。

    一旦这些处理好了,编译是相当简单的:

    $ g++ -m32 dice.cpp -o dice32 -L /usr/lib -march=i686

    -m32 标志告诉 GCC 以 32 位模式编译。-march=i686 选项进一步定义来使用哪种最优化类型(参考 info gcc 了解选项列表)。-L 标志设置你希望 GCC 来链接的库的路径。对于 32 位来说通常是 /usr/lib,不过,这依赖于你的系统是如何设置的,它可以是 /usr/lib32,甚至 /opt/usr/lib,或者任何你知道存放你的 32 位库的地方。

    在代码编译后,查看你的构建的证据:

    $ file ./dice32dice: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),dynamically linked (uses shared libs) [...]

    接着,当然, ldd ./dice32 也会指向你的 32 位库。

    不同的架构

    在 64 位相同的处理器家族上允许 GCC 做出很多关于如何编译代码的假设来编译 32 位软件。如果你需要为完全不同的处理器编译,你必需安装适当的交叉构建实用程序。安装哪种实用程序取决于你正在编译的东西。这个过程比为相同的 CPU 家族编译更复杂一点。

    当你为相同处理器家族交叉编译时,你可以期待找到与 32 位库集的相同的 64 位库集,因为你的 Linux 发行版是同时维护这二者的。当为一个完全不同的架构编译时,你可能不得不穷追你的代码所需要的库。你需要的版本可能不在你的发行版的存储库中,因为你的发行版可能不为你的目标系统提供软件包,或者它不在容易到达的位置提供所有的软件包。如果你正在编译的代码是你写的,那么你可能非常清楚它的依赖关系是什么,并清楚在哪里找到它们。如果代码是你下载的,并需要编译,那么你可能不熟悉它的要求。在这种情况下,研究正确编译代码需要什么(它们通常被列在 README 或 INSTALL 文件中,当然也出现在源文件代码自身之中),然后收集需要的组件。

    例如,如果你需要为 ARM 编译 C 代码,你必须首先在 Fedora 或 RHEL 上安装 gcc-arm-linux-gnu(32 位)或 gcc-aarch64-linux-gnu(64 位);或者,在 Ubuntu 上安装 arm-linux-gnueabi-gcc 和 binutils-arm-linux-gnueabi。这提供你需要用来构建(至少)一个简单的 C 程序的命令和库。此外,你需要你的代码使用的任何库。你可以在惯常的位置(大多数系统上在 /usr/include)放置头文件,或者,你可以放置它们在一个你选择的目录,并使用 -I 选项将 GCC 指向它。

    当编译时,不使用标准的 gcc 或 g++ 命令。作为代替,使用你安装的 GCC 实用程序。例如:

    $ arm-linux-gnu-g++ dice.cpp \ -I/home/seth/src/crossbuild/arm/cpp \ -o armdice.bin

    验证你构建的内容:

    $ file armdice.binarmdice.bin: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) [...]

    库和可交付结果

    这是一个如何使用交叉编译的简单的示例。在真实的生活中,你的源文件代码可能产生的不止于一个二进制文件。虽然你可以手动管理,在这里手动管理可能不是好的正当理由。在我接下来的文章中,我将说明 GNU 自动工具,GNU 自动工具做了使你的代码可移植的大部分工作。


    via: https://opensource.com/article/19/7/cross-compiling-gcc

    作者:Seth Kenlon 选题:lujun9972 译者:robsean 校对:wxy

    本文由 LCTT 原创编译,Linux中国 荣誉推出

    6ad065b820745c4345cceb374b411452.png?:还在看吗?
    展开全文
  • 我安装RHEL 6.0 64位系统,想使用gcc编译连接生成可执行文件,其中包含了一个32位的链接库(这个库是和别人合作的),但是总是连接不通过,请问,该怎么解决呢?
  • sudo apt-cache search aarch64 查看哪些版本可以安装; sudo apt-get install gcc-5-aarch64-linux-gnu 安装一个gcc开头的5版本的支持64bit...以上步骤是安装支持ARM64位系统的交叉编译工具, 安装之后,用aa...
  • 一、准备编译软件1.在官网下载jdk1.7、maven3.2.1、ant1.9.4,解压设置好环境变量就可以用。 环境变量设置如下:(1)执行vim /etc/profile (2)在文件尾部加入: exportJAVA_HOME=/home/spark/jdk1.7 exportMAVEN_...
  • 1.在官网下载1.3.0源码后执行如下命令: ./make-distribution.sh...个多小时后出现BUILD SUCCESS,即编译成功,可在 spark-1.3.0文件夹中找到编译的文件。 转载于:https://blog.51cto.com/liyong0802/1679137
  • 如何64位linux系统上使用汇编和C语言混合编程 最近在看于渊的一个操作系统的实现,在第五章的时候汇编和C 同时使用时碰到了问题:代码如下 foo.s   bar.c 编译和链接的时候使用的指令:(AMD处理器,...
  • 在hadoop压缩时 调用此库文件的jni(.so)来调用linux系统的功能, 一般我们的linux机器都是64位,而官网下载的hadoop安装文件都是32位编译的,因此如果不在你本机编译的话,想使用hadoop压缩功能受限。   0.1 如何...
  • linux gcc 区分32位或64位编译 ... Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_64__来进行64位编 码;...
  • 查看Linux系统/文件是32位还是64位

    万次阅读 2017-02-09 10:45:47
    如何查看Linux系统是32位还是64位如何查看可执行文件或库文件或编译的.o文件是32位还是64位
  • 源码如下: #include <unistd.h> #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <...}
  • Wine(“Wine Is Not an Emulator”的首字母缩写)是一个能够在多种POSIX-compliant操作系统(诸如Linux,Mac OSX及BSD等)上运行Windows应用的兼容层。Wine 发布了最新的1.7.53版本。此版本带来的大量性能提升,...
  • Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_64__来进行64位编 码;64位的gentoo下stdio.h就是个简单例子(i不晓得其它的是不是?);...
  • 本章我将详细介绍如何Linux系统编译FFmpeg for Android。 前期准备: Linux环境(Ubuntu 16.04):64位 NDK :可以从NDK官网上下载,Linux上可以直接用命令行下载我这里使用的是android-n...
  • 32位 与64位编译

    千次阅读 2012-09-01 22:48:17
    为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且...
  • 注意下载GCC要特别注意你的系统是多少位的如果是i386就是32位的 下载GCC要下载32位的就是下面网盘中的,如果是64位可以下载最新的GCC它是64位的 32位GCC的下载地址(这个是网上看的) pan.baidu....
  • Linux系统区分32/64位,相应地,应用程序、共享库和内核模块也区分32/64位。 本文以Ubuntu系统为例,介绍如何编译和使用32/64位的应用程序、共享库和内核模块。 1. 应用程序 要点: 使用gcc编译器的-m32和-m64...
  • ld.bin: skipping incompatible /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE/libperl.so when searching for -lperl ...应该是需要32位的libperl.so,但目前系统中只有64位的,该如何解决?
  • 为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 134
精华内容 53
关键字:

如何编译64位linux系统

linux 订阅