关于在64位linux下开发32位linux程序的一些问题,ubuntu,debian,opensuse,centos7.9
1,debian x64上支行ubuntuX64编译的32位程序
Linux debian 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64
需要安装包
apt-get install lib32stdc++6 apt install glibc-devel.i686 glibc-devel apt-get install lib32z1-dev
apt install libc6-dev-i386
软件包:lib32z1-dev(1:1.2.8.dfsg-2+deb8u1) [security] lib32z1-dev 的相关链接 Screenshot Debian 的资源: 报告问题 开发者信息 Debian Changelog 版权文件 Debian 补丁追踪网站 下载源码包 zlib: [zlib_1.2.8.dfsg-2+deb8u1.dsc] [zlib_1.2.8.dfsg.orig.tar.gz] [zlib_1.2.8.dfsg-2+deb8u1.debian.tar.xz] 维护者: Mark Brown (QA 页面) 外部的资源: 主页 [zlib.net] 相似软件包: lib64z1-dev libz-mingw-w64-dev lib32z1 libz-mingw-w64 zlib1g-dev libn32z1-dev zlib1g-dbg lib64z1 zlib1g compression library - 32 bit development zlib is a library implementing the deflate compression method found in gzip and PKZIP. This package includes the development support files for building 32 bit applications. 其他与 lib32z1-dev 有关的软件包 依赖 推荐 建议 增强 dep: lib32c-dev 本虚包由这些包填实: libc6-dev-i386 dep: lib32z1 (= 1:1.2.8.dfsg-2+deb8u1) compression library - 32 bit runtime dep: zlib1g-dev (= 1:1.2.8.dfsg-2+deb8u1) 压缩库 - 开发文件
有32位的环境后,在/下可以看见

lib32,lib64的库,程序就可以运行了.
使用file ,ldd 命令查看

可以正常加载x86的地址了.
2,opensuse
openSUSE-Update-Leap-15.1 ,x64
zyppper install glibc-devel-32bit zypper install libstdc++-devel-32bit zypper install libstdc++6-32bit
前几天在64位linux下开发跨平台的代码,包括32位和64位的版本都需要编译,在给g++加上-m32开关之后,g++报了一个错误: gnu/stubs-32.h: No such file or directory compilation terminated. make: *** 在网上翻了一圈,情况就是64位linux缺省只安装了64位的头文件和Lib版本,需要增加32位的版本库,网上提到的安装方法一般是CentOs, Ubuntu之类的发行版,我用的是OpenSuse,最后在老外的网页上找到了一个比较全面的各个版本的安装说明: You need 32bit embedded GNU C Library. This incldes development Libraries, header files, contains the symlinks, headers, and object files needed to compile and link programs which use the standard C library. Fix for Debian Linux Type the following command: $ sudo apt-get install libc6-dev Fix for Ubuntu Linux Type the following command: $ sudo apt-get install libc6-dev-i386 Fix for OpenSUSE / Novell Suse Linux (SLES) Type the following command: # zypper in glibc-devel-32bit Fix for RHEL / Fedora / CentOS / Scientific Linux Type the following command: # yum install glibc-devel.i686 安装了头文件,还要注意安装库文件,方法同上,包括以下库: gcc-32bit gcc7-32bit libstdc++6-gcc7-32bit libstdc++6-gcc7-locale libstdc++6-locale
3,ubuntu x64上支行32位程序
Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-142-generic x86_64)
apt-get install ia32-libs apt-get install lib32ncurses5 apt-get install lib32z1 apt-get install lib32z1-dev apt install libc6-dev-i386
Ubuntu apt-get install ia32 for 32-bit on 64-bit 先更新 ia32的库 复制代码 https://www.cnblogs.com/tianciliangen/articles/3395973.html To install 32-bit libraries on a 64-bit linux system Install: $ apt-get install ia32-libs To install 32-bit libraries for development Install: $ apt-get install lib32gcc1 libc6-i386 lib32z1 lib32stdc++6 $ apt-get install lib32asound2 lib32ncurses5 lib32gomp1 lib32z1-dev lib32bz2-dev $ apt-get install g++-multilib You may need this too, or it may be a virtual package already provided: $ apt-get install ia32-libs-gtk You may need a symlink, which g++-multilib may set up for you automatically: $ ln -s /usr/lib32/libstdc++.so.6 /usr/lib32/libstdc++.so Update LD_LIBRARY_PATH You may need to add the LD path, for example like this: $ edit /etc/profile ... add these lines... LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib32:/usr/lib32 export LD_LIBRARY_PATH To compile with gcc To compile things with gcc, you need to add the flag -m32 like this: gcc -m32 myfile.c
4,centos7.9 x64编译x32
#先更新
yum update
sudo yum install -y glibc-devel.i686 libgcc.i686
sudo yum install -y gcc gcc-c++
sudo yum install -y glibc-devel.i686
sudo yum install -y libstdc++-devel.i686
sudo yum install -y zlib-devel.i686 openssl-devel.i686 ncurses-devel.i686
#在 CentOS 7 上遇到 libstdc++.so.6: version 'GLIBCXX_3.4.20' not found
错误通常意味着你的系统中缺少或者版本过旧的 libstdc++ 库,而你的程序需要更高版本的库。
这通常发生在使用了较新编译的二进制文件,而这些二进制文件依赖于更高版本的 libstdc++。
sudo yum install epel-release
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
最后发现还是不行,改用安装 docker-ubuntu来解决
Dockerfile 文件内容
#一个 dockerfile 可以有多个 FROM # 使用官方的Ubuntu 16.04镜像作为基础镜像 FROM ubuntu:16.04 # 维护人信息 #MAINTAINER Generate SnmpServer North docker image<xxx@xxx.com> # 设置时区(可选) ENV TZ=Etc/UTC RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 工作目录 WORKDIR /app # 更新软件包列表 RUN apt-get update # 更新软件源并安装必要的工具链和库 RUN apt-get install -y \ gcc \ g++ \ make \ gcc-multilib \ g++-multilib \ libc6-dev-i386 \ libssl-dev RUN apt-get install -y lib32gcc1 libc6-i386 lib32z1 lib32stdc++6 RUN apt-get install -y apt-utils # 安装基本工具,例如curl, wget, vim等 #RUN apt-get install -y curl wget vim net-tools iputils-ping # 清理缓存 RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # 添加环境变量 ENV PATH=$PATH:/app ENV LD_LIBRARY_PATH=/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:/app # 容器启动时默认进入bash CMD ["/bin/bash"] COPY docker-entrypoint.sh /app RUN chmod u+x /app/docker-entrypoint.sh # 启动服务 #ENTRYPOINT ["/bin/sh", "cmain.exe"] ENTRYPOINT ["/bin/sh", "/app/docker-entrypoint.sh"]
#一个 dockerfile 可以有多个 FROM # 使用官方的Ubuntu 16.04镜像作为基础镜像 FROM ubuntu:16.04 # 维护人信息 #MAINTAINER Generate SnmpServer North docker image<xxx@xxx.com> # 设置时区(可选) ENV TZ=Etc/UTC RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 工作目录 WORKDIR /app # 更新软件包列表 RUN apt-get update # 更新软件源并安装必要的工具链和库 RUN apt-get install -y \ gcc \ g++ \ make \ gcc-multilib \ g++-multilib \ libc6-dev-i386 \ libssl-dev RUN apt-get install -y lib32gcc1 libc6-i386 lib32z1 lib32stdc++6 RUN apt-get install -y apt-utils # 安装基本工具,例如curl, wget, vim等 #RUN apt-get install -y curl wget vim net-tools iputils-ping # 设置环境变量,确保使用 UTF-8 编码 ENV LANG C.UTF-8 ENV LANGUAGE zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 # 更新软件包列表并安装必要的语言包和字体 RUN apt-get install -y locales && \ locale-gen zh_CN.UTF-8 && \ update-locale LANG=zh_CN.UTF-8 && \ apt-get install -y fonts-wqy-zenhei && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # 清理缓存 RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # 添加环境变量 ENV PATH=$PATH:/app ENV LD_LIBRARY_PATH=/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:/app # 容器启动时默认进入bash CMD ["/bin/bash"] COPY docker-entrypoint.sh /app RUN chmod u+x /app/docker-entrypoint.sh # 启动服务 #ENTRYPOINT ["/bin/sh", "cmain.exe"] ENTRYPOINT ["/bin/sh", "/app/docker-entrypoint.sh"]
docker-entrypoint.sh
#!/bin/sh svc="/app/swrunx86_r" #一直执行 while [ 1 ] do if ps -ef | grep $svc | egrep -v grep >/dev/null then # outtime=$(date "+%Y-%m-%d %H:%M:%S") # echo "$outtime,$svc found!XXXXXXXXXXXXXXX1" >> /home/abc.txt cd /app/ else # outtime=$(date "+%Y-%m-%d %H:%M:%S") # export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/:./ cd /app/ /app/swrunx86_r & fi #6秒执行一次 sleep 6 done
docker创建服务.txt
docker build -t ubuntu_32_64_builder:16.04 . docker save ubuntu_32_64_builder:16.04 | gzip > ubuntu_32_64_builder_16_04.tar.gz gunzip -c /data/createdocker/ubuntu_32_64_builder_16_04.tar.gz | docker load mkdir -p /data/ubuntu_32_64/app docker run --net=host --uts=host --restart=always \ --privileged=true -d --name ubuntu_32_64 \ -v /data/ubuntu_32_64/app:/app \ -v /etc/localtime:/etc/localtime:ro \ ubuntu_32_64_builder:16.04
浙公网安备 33010602011771号