针对flashrom不同版本的常规编译、交叉编译、静态编译方法总结
常规编译
flashrom从1.2版本开始支持meson编译,之前的版本都是make编译
安装依赖项
flashrom常规依赖项:
sudo apt-get install -y \
gcc meson ninja-build pkg-config python3-sphinx \
libcmocka-dev libpci-dev libusb-1.0-0-dev libftdi1-dev libjaylink-dev
只有libpci-dev是internal内部编程选项的需求的库,其他lib库在没有需求的情况都可以不安装
meson编译
meson setup –help 可以查看配置参数,根据需要来选择
meson setup builddir/
meson compile -C builddir/
meson test -C builddir/
meson install -C builddir/
针对新版本的交叉编译
在没有目标系统库限制的情况下,可以直接安装gnu的交叉编译链工具。
这里以powerpc为例:
sudo apt install gcc-powerpc-linux-gnu g++-powerpc-linux-gnu
交叉编译依赖项
前面提到flashrom依赖libpci-dev库,而它又依赖其他几个库,这些库都需要自己交叉编译后才能正常编译flashrom。
由于需要静态编译flashrom,这些依赖库也都需要静态编译的
zlib交叉编译
交叉编译
tar -xvf zlib-1.3.1.tar.gz
cd zlib-1.3.1/
./configure --prefix=/usr/powerpc-linux-gnu/
修改Makefile:
静态编译:
make CC=powerpc-linux-gnu-gcc AR=powerpc-linux-gnu-ar CONFIG_STATIC=yes
sudo make install
libudev交叉编译
libudev编译起来依赖太多了,很麻烦,用eudev代替,同样能获得libudev.so
源码下载:https://dev.gentoo.org/~blueness/eudev/
交叉编译:
tar -xvf eudev-3.2.5.tar.gz
cd eudev-3.2.5/
./configure --host=powerpc-linux-gnu CC=powerpc-linux-gnu-gcc AR=powerpc-linux-gnu-ar --disable-blkid --disable-kmod CONFIG_STATIC=yes
make -j2
sudo make install
libpci交叉编译
源码下载:https://www.kernel.org/pub/software/utils/pciutils/
编辑Makefile:
strip不认powerpc的这两个文件,可以直接注释掉:
也可以将$(STRIP)改为交叉编译工具:powerpc-linux-strip
编译安装:
sudo make CFLAGS=-static
sudo make install
sudo make install-lib
sudo make install-pcilib
powerpc-linux-gnu/lib目录下有Libpci.a文件就Ok了:
meson编译配置
创建meson交叉编译的配置文件:./flashrom/meson_cross/powerpc.txt
# This file is for cross compiling flashrom for powerpc.
#
# Make sure the program names match your toolchain
#
# Make sure pkg-config can find your self compiles libpci
# or add the path of your libpci.pc as 'pkg_config_libdir'
# under [properies] below.
[binaries]
c = 'powerpc-linux-gnu-gcc'
ar = 'powerpc-linux-gnu-gcc-ar'
strip = 'powerpc-linux-gnu-strip'
pkgconfig = 'pkg-config'
[host_machine]
system = 'linux'
cpu_family = 'ppc'
cpu = 'e500v2'
endian = 'big'
[built-in options]
c_std = 'gnu99'
c_args = '-static'
c_link_args = '-static /usr/powerpc-linux-gnu/lib/libudev.a /usr/powerpc-linux-gnu/lib/libz.a /usr/powerpc-linux-gnu/lib/libc.a '
[project options]
tests = 'disabled'
ich_descriptors_tool = 'disabled'
[properties]
运行meson setup:
meson setup –help 可以查看配置参数,根据需要来选择
–libdir 在交叉编译的情况下一定要更改
meson setup --cross-file ./meson_cross/powerpc.txt --buildtype release --libdir powerpc-linux-gnu/lib --bindir powerpc-linux-gnu/bin --includedir powerpc-linux-gnu/include --sbindir powerpc-linux-gnu/sbin --datadir powerpc-linux-gnu/share -Dtests=disabled -Dprogrammer=internal ./static_build/
需要重复修改配置的情况下,添加参数:–reconfigure
编译:
meson compile -C static_build/
针对旧版本的交叉编译
有些目标系统的glib库版本很低,内核版本也很低,直接用高版本的flashrom运行不了。需要根据目标系统版本来构建对于的交叉编译链工具。
交叉编译链工具制作
由于目标系统各种库版本都较低,为了减少工作量,选择在Ubuntu 14.04上进行交叉编译工具的制作。
- ubuntu 14.04
- gcc 4.8
依赖项安装:
sudo apt-get install bison flex texinfo gawk
前置准备
查看目标系统的glibc版本:
$ ldd --version
ldd (GNU libc) 2.8
根据目标系统来下载相应版本的glibc源码包:https://ftp.gnu.org/gnu/glibc/
下载binutils: https://ftp.gnu.org/gnu/binutils/
下载gcc:https://ftp.gnu.org/gnu/gcc/
下载编译gcc依赖的两个库:
根据目标系统内核版本来下载内核源码包:https://www.kernel.org/pub/linux/kernel/
- 前期需要用到库:
glibc-2.8.tar.gz
glibc-linuxthreads-2.5.tar.bz2
gcc-4.4.0.tar.bz2
binutils-2.17.tar.bz2
linux-2.6.18.tar.gz
gmp-4.3.2.tar.bz2
mpfr-2.4.2.tar.bz2
- 编译目录和环境变量设置:
cd $HOME
mkdir ppc
cd ppc
mkdir sources
mkdir tools
export TARGET=powerpc-linux
export TOOLS=~/ppc/tools
export SOURCES=~/ppc/sources
export PATH=$TOOLS/bin:$PATH
export LANGUAGE=C
export LC_ALL=C
交叉编译链制作
- 安装内核头文件
tar -xvf linux-2.6.18.tar.gz
cd linux-2.6.18/
sudo apt install unifdef
make ARCH=powerpc INSTALL_HDR_PATH=$TOOLS/$TARGET/usr headers_install
- binutils安装
解压包并打补丁:
补丁下载:https://www.linuxfromscratch.org/patches/downloads/binutils/
tar jxvf binutils-2.17.tar.bz2
cd binutils-2.17/
patch -Np1 -i binutils-2.17-posix-1.patch
patch -Np1 -i binutils-2.17-ppc64_fix_testsuite-1.patch
编译安装:
mkdir binutils-build
cd binutils-build/
../configure --prefix=$TOOLS --target=$TARGET --disable-nls --enable-shared --disable-multilib
make CFLAGS="-Wno-error=unused-but-set-variable -Wno-error=switch -Wno-error=format-security" -j2
make install
安装完成后的tools目录:
- 交叉编译临时gcc
编译依赖库:
tar jvxf gmp-4.3.2.tar.bz2
cd gmp-4.3.2/
./configure --enable-cxx --enable-mpbsd --prefix=/usr
make -j2
sudo make install
tar jvxf mpfr-2.4.2.tar.bz2
cd mpfr-2.4.2/
./configure --prefix=/usr
make -j2
sudo make install
编译gcc:
tar jvxf gcc-4.4.0.tar.bz2
cd gcc-4.4.0/
mkdir gcc-build
cd gcc-build/
../configure --target=$TARGET --prefix=$TOOLS --disable-nls --disable-shared --disable-multilib --disable-decimal-float --disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --without-headers --with-newlib --enable-languages=c
make all-gcc -j2
make all-target-libgcc
make install-gcc
make install-target-libgcc
make install
如遇报错@itemx must follow @item则需要将texinfo版本降级:
sudo apt remove texinfo
wget http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz
tar -xvf texinfo-4.13a.tar.gz
cd texinfo-4.13/
./configure
make -j2
sudo make install
- 交叉编译glibc
tar -xvf glibc-2.8.tar.gz
tar jvxf glibc-linuxthreads-2.5.tar.bz2 --directory=glibc-2.8/
修改Makeconfig:
#gnulib := -lgcc $(libgcc_eh)
#static-gnulib := -lgcc -lgcc_eh $(libunwind)
-->
gnulib := -lgcc
static-gnulib := -lgcc
编译:
cd glibc-2.8/
mkdir glibc-build
CC=$TOOLS/bin/${TARGET}-gcc
../configure --prefix=/ --host=$TARGET --build=$(../scripts/config.guess) --with-headers=$TOOLS/$TARGET/usr/include/ --with-binutils=$TOOLS/$TARGET/bin --disable-profile libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
make -j2
make install_root=$TOOLS/$TARGET prefix="" install
修改$TOOLS/$TARGET/lib/libc.so,把/lib去掉:
- 编译完整的gcc
cd gcc-4.4.0/
mkdir gcc-full-build
../configure --target=$TARGET --host=$(../config.guess) --prefix=$TOOLS --with-headers=$TOOLS/$TARGET/usr/include/ --enable-languages=c,c++ --disable-libgomp --disable-multilib --disable-nls --enable-shared
make all -j2
make install
编译完成,将工具目录加入到PATH环境变量里就可以使用了:
export TOOLS=~/ppc/tools
export PATH=$TOOLS/bin:$PATH
交叉编译依赖项
在使用glibc <= 2.22和gcc < 7版本的情况下,只能编译flashrom 0.99及之后的版本。
而且不能编译libudev,因为libudev 需求的依赖库太多了,还需要glib 2.22以上的版本。
唯一需要编译的是pcituil。
下载pciutils 3.1.5和flashrom的补丁: http://flashrom.org/File:Pciutils.patch.gz
修改Makefile:
编译安装:
make -j2 CFLAGS=-static
make install
make install-lib
编译配置
- 0.9.8版本
make PREFIX=$TOOLS/$TARGET CC=powerpc-linux-gcc AR=powerpc-linux-ar STRIP=powerpc-linux-strip RANLIB=powerpc-linux-ranlib CONFIG_FT2232_SPI=no CONFIG_DEDIPROG=no CHECK_LIBPCI=no NOWARNERROR=yes CFLAGS+=-static LDFLAGS+=-static
- 0.9.9版本
make PREFIX=$TOOLS/$TARGET CC=powerpc-linux-gcc AR=powerpc-linux-ar STRIP=powerpc-linux-strip RANLIB=powerpc-linux-ranlib NOWARNERROR=yes CONFIG_STATIC=yes CONFIG_ENABLE_LIBUSB1_PROGRAMMERS=no CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=0 -j2
需要关闭USB依赖的编程器选项,否则就需要libudev库了。
参考
https://www.cnblogs.com/geekard/archive/2012/05/06/powerpc-toolchain.html
https://www.flashrom.org/dev_guide/building_from_source.html
近期评论