关于在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

 

 

 

 

 

 

 

 

 

  

 

posted @ 2020-06-11 11:11  bleach3  阅读(1407)  评论(0)    收藏  举报