cross compile

cross compile

arm gcc

又一次要进行 cross compile. 记录一下问题.

这一次是直接使用的 friendlyarm 的 gcc.

git clone https://github.com/friendlyarm/prebuilts.git
sudo mkdir -p /opt/FriendlyARM/toolchain
sudo tar xf prebuilts/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C /opt/FriendlyARM/toolchain/

glibc

出现的问题在于 libc 的版本问题. 这个包里的工具链是依赖于 libc-2.14 的, 但是 centos 6.7 的系统里的
只有 2.12 libc.

所以第一步是安装一个 libc

wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz

tar zxvf glibc-2.14.tar.gz

cd glibc-2.14

mkdir build

cd build

../configure --prefix=/opt/glibc-2.14

make -j4

sudo make install

export LD_LIBRARY_PATH=/opt/glibc-2.14/lib

nginx

nginx 正常的情况下要进行一些分析探测当前的机器是不是支持一些功能, 如 epoll, int 大小之类的.
但是在 cross compile 的情况下, 进行探测的结果并不是最后运行的机器的环境. 所以这些探测可能都会失败.

所以要做一些调整, 以及手动开启一些功能.

  • 修改 auto/cc/name@21 的 exit 1, 注释掉.
  • 修改 auto/types/sizeof@48 直接设置 ngx_size 为 4.
  • 修改 auto/modules@43 开启 epoll 模块

增加如下的 flags.

FLAGS='-D NGX_HAVE_GCC_ATOMIC -DNGX_SYS_NERR=132 -DNGX_PTR_SIZE=4 -DNGX_HAVE_SYSVSHM=1 \
-DNGX_HAVE_EPOLL -DNGX_HAVE_EPOLLRDHUP=1 -DNGX_TEST_BUILD_EPOLL=0 -DNGX_HAVE_EPOLLEXCLUSIVE=0'

一些环境变量的分析会出现问题:

  • NGX_HAVE_GCC_ATOMIC: 使用 gcc 的 atomic, nginx 支持几个 atomic 没有 arm.
  • NGX_PTR_SIZE: arm 的机器是 32 位的.
  • NGX_HAVE_SYSVSHM: 对于 shm 的探测好像也出现了问题.
  • NGX_HAVE_EPOLL: 使用 epoll
  • NGX_HAVE_EPOLLRDHUP: 使用 epoll rdhup 事件
  • NGX_TEST_BUILD_EPOLL: 关闭 epoll 测试代码
  • NGX_HAVE_EPOLLEXCLUSIVE: 关闭 EPOLLEXCLUSIVE 功能

configure:

./configure --prefix=/opt/root/ \
           --with-cc=/opt/Friendly_ARMv7/4.9.3/bin/arm-linux-gcc \
           --without-http_rewrite_module \
           --without-http_gzip_module \
           --with-cc-opt="'$FLAGS'"
make
make install

这样可以正常生成最后的 nginx.

其实如果有一个 arm 的系统, 直接编译 nginx 也是非常简单的, 一般情况下也不用
去交叉编译这些上层的程序.


发表评论

邮箱地址不会被公开。 必填项已用*标注