linux笔记 · 2024年4月23日 0

flashrom编译总结

针对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交叉编译

源码下载:https://www.zlib.net/

交叉编译

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]

   = '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://ftp.gnu.org/gnu/gmp/

https://ftp.gnu.org/gnu/mpfr/

根据目标系统内核版本来下载内核源码包: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=    

export LC_ALL=C

交叉编译链制作

  1. 安装内核头文件
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

  1. 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目录:

  1. 交叉编译临时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

  1. 交叉编译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去掉:

  1. 编译完整的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

https://mesonbuild.com/Reference-tables.html