Ubuntu交叉編譯aarch64平臺libcgroup工具

編譯過程

1. 下載libcgroup-0.41.tar.xz軟件包

下載路徑如下:

2. 安裝交叉編譯工具

編譯工具binutils-aarch64-linux-gnu,gcc-aarch64-linux-gnu和g++-aarch64-linux-gnu,在Ubuntu-18.04上默認會安裝gcc-7版本,注意此處必須要安裝g++-aarch64-linux-gnu,編譯過程中需要用到,否則會出錯;

  •     sudo apt install binutils-aarch64-linux-gnu
  •     sudo apt install gcc-aarch64-linux-gnu
  •     sudo apt install g++-aarch64-linux-gnu

3. 將軟件包解壓並進入目錄

  •     xz -d libcgroup-0.41.tar.xz
  •     tar -xf libcgroup-0.41.tar
  •     cd libcgroup-0.41

4. 配置並進行編譯

主要有四個步驟:

4.1 安裝依賴包

  • sudo apt install automake m4 libtool bison flex

4.2 執行configure文件生成Makefile

  • $ CC=aarch64-linux-gnu-gcc CROSS_COMPILE=aarch64-linux-gnu- CXX=aarch64-linux-gnu-g++ ./configure --prefix /media/hugo/kston/source/libcgroup-0.41/_install --disable-pam --host aarch64-linux-gnu

4.3 編譯

  • make

4.4 安裝

  • make install

其中configure的時候需要配置相應的選項,可以根據環境以及需要配置

 

編譯可能遇到的問題

1. configure時功能不支持問題

log如下:
checking for pam_syslog in -lpam... no
configure: error: Cannot compile PAM module without libpam!

通過查看help可以看到該功能相關信息:
--enable-pam-module-dir=PATH
                          specify location of libcgroup PAM module
                          (default=$libdir/security)

查看help的方式如下:

  •     ./configure --help

解決方式:./configure 添加 --disable-pam 選項註釋掉該功能

2. 修改了configure.in或者configure.am

直接編譯會出錯:
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /media/hugo/kston/source/libcgroup-0.41/missing aclocal-1.13
/media/hugo/kston/source/libcgroup-0.41/missing: line 81: aclocal-1.13: command not found
WARNING: 'aclocal-1.13' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
Makefile:397: recipe for target 'aclocal.m4' failed
make: *** [aclocal.m4] Error 127
需要在修改之後重新生成配置信息:

  •     autoreconf -ivf

3. 如果autoreconf出錯

需要安裝libtool工具:

  •     sudo apt install libtool

4. 出現函數未定義的問題

log如下:
  CCLD     cgrulesengd
cgrulesengd.o: In function `cgre_store_unchanged_process':
/media/hugo/kston/source/libcgroup-0.41/src/daemon/cgrulesengd.c:310: undefined reference to `rpl_realloc'
cgrulesengd.o: In function `cgre_store_parent_info':
/media/hugo/kston/source/libcgroup-0.41/src/daemon/cgrulesengd.c:223: undefined reference to `rpl_realloc'
../../src/.libs/libcgroup.a(api.o): In function `cg_test_mounted_fs':
/media/hugo/kston/source/libcgroup-0.41/src/api.c:1085: undefined reference to `rpl_malloc'
../../src/.libs/libcgroup.a(api.o): In function `cg_set_control_value':
/media/hugo/kston/source/libcgroup-0.41/src/api.c:1387: undefined reference to `rpl_malloc'

這是因爲在配置中對相應的malloc和realloc函數進行了重定義AC_FUNC_MALLOC和AC_FUNC_REALLOC註釋掉,執行autoreconf操作之後再次編譯即可

5. 編譯出現File format wrong問題

log如下:
  CCLD     libcgrouptest01
  CXX      libcg_ba.o
  CXXLD    libcg_ba
/usr/bin/ld: ../src/.libs/libcgroup.a(api.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: ../src/.libs/libcgroup.a(api.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: ../src/.libs/libcgroup.a(api.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: ../src/.libs/libcgroup.a(api.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: ../src/.libs/libcgroup.a(api.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: ../src/.libs/libcgroup.a(api.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: ../src/.libs/libcgroup.a(api.o): Relocations in generic ELF (EM: 183)
../src/.libs/libcgroup.a: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
Makefile:733: recipe for target 'libcg_ba' failed
make[3]: *** [libcg_ba] Error 1
make[3]: Leaving directory '/media/hugo/kston/source/libcgroup-0.41/tests'
Makefile:850: recipe for target 'all-recursive' failed
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory '/media/hugo/kston/source/libcgroup-0.41/tests'
Makefile:471: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/media/hugo/kston/source/libcgroup-0.41'
Makefile:376: recipe for target 'all' failed
make: *** [all] Error 2

通過./configure --help可以看到有一些交叉編譯符號需要設置,此處CXXLD識別不了文件格式,打印文件格式錯誤,所以應該設置該符號重新編譯,即在./configure過程中指定

  •     CXX=aarch64-linux-gnu-g++

重新執行configure過程後make編譯

6. 此時出現新的問題

log如下
checking whether we are cross compiling... configure: error: in `/media/hugo/kston/source/libcgroup-0.41':
configure: error: cannot run C++ compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details

看起來在交叉編譯時需要指定其他參數,如--host,表示目標文件需要執行的平臺,而通過--help信息也可以看到configure對相關交叉編譯選項的說明,指定平臺信息:

  •     --host aarch64-linux-gnu

重新編譯通過

7. 通過--prefix指定文件安裝路徑

在進行make install將編譯目標安裝到對應路徑,如果不存在路徑,則會自動創建
$ ls -l _install/
total 20
drwxr-xr-x 2 hugo hugo 4096 3月  30 22:34 bin
drwxr-xr-x 3 hugo hugo 4096 3月  30 22:34 include
drwxr-xr-x 3 hugo hugo 4096 3月  30 22:34 lib
drwxr-xr-x 2 hugo hugo 4096 3月  30 22:34 sbin
drwxr-xr-x 3 hugo hugo 4096 3月  30 22:34 share

文件信息如下:
$ tree _install/{bin,lib,sbin}
_install/bin
├── cgclassify
├── cgcreate
├── cgdelete
├── cgexec
├── cgget
├── cgset
├── cgsnapshot
├── lscgroup
└── lssubsys
_install/lib
├── libcgroup.la
├── libcgroup.so -> libcgroup.so.1.0.41
├── libcgroup.so.1 -> libcgroup.so.1.0.41
├── libcgroup.so.1.0.41
└── pkgconfig
    └── libcgroup.pc
_install/sbin
├── cgclear
├── cgconfigparser
└── cgrulesengd

1 directory, 17 files

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章