在构建编译器时,除了glibc版本之外,还必须指定Linux头版本和最小支持的内核版本.然后在目标机器上有实际的内核版本和glibc版本(具有自己的内核头文件版本和最低支持的内核版本).我很难理解这些版本是如何结合在一起的.
示例1:假设我的系统具有针对内核头3.14构建的glibc 2.13.这有任何意义吗?这怎么可能的glibc 2.13(2011年发布)使用新的内核功能,从3.14(2014年发布)?
例2:假设我有一个编译器,glibc的版本更新比2.13.编译程序是否可以在glibc 2.13系统上运行?如果编译器的glibc版本早于2.13?
示例3:来自https://sourceware.org/glibc/wiki/FAQ#What_version_of_the_Linux_kernel_headers_should_be_used.3F我明白如果它满足编译glibc时使用的"最小内核版本",则可以使用旧内核.但我不明白这段话The other way round (compiling the GNU C library with old kernel headers and running on a recent kernel) does not necessarily work as expected. For example you can't use new kernel features if you used old kernel headers to compile the GNU C library.
.这是唯一可能发生在我身上的事吗?如果内核比编译时更新,它会不会在glibc中破坏某些东西?
示例4:在glibc设置中做更细微的差别(例如,将可执行文件与针对内核头文件3.Y编译的glibc版本2.X 链接到最小支持内核版本2.6.A并在具有相同glibc 2.X的系统上执行,但针对内核头文件编译 …
我正在尝试使用工具链Crosstool-NG
.我使用Crosstool-NG 1.22.0
的OS X 10.11.4
.
我安装使用homebrew
,所以我不确定为什么我缺少依赖项.当我尝试构建时,这是我的输出:
$ ct-ng build
[INFO ] Performing some trivial sanity checks
[INFO ] Build started 20160504.172530
[INFO ] Building environment variables
[ERROR] Missing: 'x86_64-apple-darwin15.4.0-gcj' or 'x86_64-apple-darwin15.4.0-gcj' or 'gcj' : either needed!
[ERROR]
[ERROR] >>
[ERROR] >> Build failed in step '(top-level)'
[ERROR] >>
[ERROR] >> Error happened in: CT_Abort[scripts/functions@329]
[ERROR] >> called from: CT_TestAndAbort[scripts/functions@351]
[ERROR] >> called from: main[scripts/crosstool-NG.sh@458]
[ERROR] >>
[ERROR] >> For more info on this …
Run Code Online (Sandbox Code Playgroud) 我正在尝试让 crosstool-ng 与 C 和 C++ 一起工作。尽管我在使用 menuconfig 时选择了 C++,但它似乎并没有被构建。gcc 编译器按预期工作,但不是 g++
我不确定我做错了什么,所以任何帮助将不胜感激。
我按照此处找到的步骤操作: 使用 Crosstool-NG 构建嵌入式 ARM 系统
$ arm-unknown-linux-gnueabi-cpp main.cpp -o test
arm-unknown-linux-gnueabi-cpp: main.cpp: C++ compiler not installed on this system
Run Code Online (Sandbox Code Playgroud)
注意:arm-unknown-linux-gnueabi-g++
bin 目录中没有找到 on。我试过跨工具版本 1.16.0 和 1.15.3
arm-unknown-linux-gnueabi-cpp -v
Using built-in specs.
Target: arm-unknown-linux-gnueabi
Configured with: /opt/crossArm/.build/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-unknown-linux-gnueabi --prefix=/opt/crossArm/.build/arm-unknown-linux-gnueabi/buildtools --with-local-prefix=/home/jgarvin/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot --disable-libmudflap --with-sysroot=/home/jgarvin/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot --enable-shared --with-pkgversion='crosstool-NG 1.16.0' --with-float=soft --enable-__cxa_atexit --with-gmp=/opt/crossArm/.build/arm-unknown-linux-gnueabi/buildtools --with-mpfr=/opt/crossArm/.build/arm-unknown-linux-gnueabi/buildtools --enable-target-optspace --disable-libgomp --disable-libmudflap --disable-nls --disable-multilib --enable-languages=c
Thread model: posix
gcc version 4.3.2 (crosstool-NG 1.16.0)
Run Code Online (Sandbox Code Playgroud)
我有一个有效的交叉编译工具链,感谢crosstool-ng :) - 然而,crosstool-ng的文档很少,而且我是交叉编译的全新工具.我认为,具体的主持人和目标在这方面并不重要.
我有一些关于目录结构的基本问题.工具链安装在以目标命名的目录中.里面是一组目录:
arm-unknown-linux-gnueabi
bin
include
lib
libexec
share
Run Code Online (Sandbox Code Playgroud)
我认为这是针对实际的交叉编译器位,因为bin /中的编译器可以用于此目的.请注意,有一个内部arm-unknown-linux-gnueabi /目录,即其中的路径../arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi
.里面还有另一棵树:
bin
debug-root
include
lib
lib32
lib64
sysroot
Run Code Online (Sandbox Code Playgroud)
lib*目录是sysroot /的符号链接.bin中的东西似乎与父目录/ bin中的交叉编译工具集相同:
> bin/gcc -v
Using built-in specs.
COLLECT_GCC=./gcc
Target: arm-unknown-linux-gnueabi
Configured with: /usr/x-tool/.build/src/gcc-4.7.2/configure
--build=x86_64-build_unknown-linux-gnu
--host=x86_64-build_unknown-linux-gnu
--target=arm-unknown-linux-gnueabi
Run Code Online (Sandbox Code Playgroud)
所以我的第一个问题是:这些是为了什么?这个目录是什么?
我的第二个问题是:sysroot /应该如何使用?它显然是针对目标平台本地的支持库,所以我假设我是否正在构建这样的库我应该使用它--prefix
,尽管它与使用父目录相同,因为lib*是符号链接的...这个"中间目录"的bin和符号链接到sysroot是令人困惑的.我相信(某些)autotools样式包可以配置"--with-sysroot". 如果我看到它,那么它的意义是什么?它应该如何用于其他选项,如--prefix等?
我已经安装了一个带有Emdebian的Raspberry PI,并希望交叉编译项目.
有很多关于如何获得工具链并使用它构建一个简单项目的文档.我自己设法用crosstool-ng构建了一个工具链,并编写了一个工作正常的hello world程序.
我没有得到的是如何处理交叉编译更复杂的项目,如Qt,它们依赖于其他库.我们以libdbus为例,因为这是Qt的依赖项之一.
已安装的Emdebian已经包含了libdbus.so,所以我更愿意使用它,而不是交叉编译我自己的libdbus.so,因为编译Qt的所有依赖都需要花费很多时间.
对于交叉编译,据我所知,有两个重要的目录:
获取rootfs目录很简单,因为它可以是来自设备的NFS挂载.但是,如何在PI上获取现有Emdebian安装的暂存目录?登台目录需要包含诸如dbus标头之类的东西,这些标头未安装在rootfs上.
有些人只需使用apt-get install libdbus-dev在设备上安装dbus头,然后使用rootfs作为暂存目录.使用此设置,rootfs和staging之间没有区别,缺点是rootfs受到头文件,文档等的污染.当然,优势在于它很容易.
将dbus标头放入主机上的暂存目录的最佳方法是什么?人们在这种情况下使用的常用方法是什么?
作为一个附带问题,为什么获得工具链,编译程序然后将其复制到目标上的方法根本就起作用?工具链附带了自己的libc,libstdc ++等版本,它们是否与目标上安装的版本不兼容?特别是在使用使用crosstool-ng编译的自定义工具链创建时?
(请注意,我不是在问如何编译Qt,我可以自己解决这个问题.我的问题更为笼统,关于将自定义工具链与现有安装/ rootfs结合使用时的方法)
我正在尝试使用构建工具链crosstool-ng
,我已经将其全部设置好,并按照http://crosstool-ng.org/#download_and_usage所述选择了我的CPU ,现在可以构建工具链了。ct-ng build
但是,当我输入时,它会由于以下错误而取消:
$ ct-ng build
[INFO ] Performing some trivial sanity checks
[INFO ] Build started 20170126.135517
[INFO ] Building environment variables
[EXTRA] Preparing working directories
[EXTRA] Installing user-supplied crosstool-NG configuration
[EXTRA] =================================================================
[EXTRA] Dumping internal crosstool-NG configuration
[EXTRA] Building a toolchain for:
[EXTRA] build = x86_64-pc-linux-gnu
[EXTRA] host = x86_64-pc-linux-gnu
[EXTRA] target = powerpc-e500v2-linux-gnuspe
[EXTRA] Dumping internal crosstool-NG configuration: done in 0.09s (at 00:02)
[INFO ] =================================================================
[INFO ] Retrieving needed toolchain …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个交叉编译器,以使用crosstool-NG定位在NAS盒上运行的处理器。
NAS盒是ZyXEL NSA210,有一个示例dmesg输出,/proc/cpuinfo
是:
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 183.09
Features : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
...
Hardware : Oxsemi NAS
Revision : 0000
Serial : 00000d51caab2d00
Run Code Online (Sandbox Code Playgroud)
目标选项页上的选项,标志和()中的当前设置:
我一直在'架构层面“装配:发射CPU”尝试各种组合,如arm926ej-s
,armv5l
,armv5tej …
我使用 crosstool-NG 使用 gcc 6.3.0 和 glibc 2.25 创建了 PowerPC 工具链。我有以下测试程序 test.c:
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
我用以下命令编译它:
powerpc-unknown-linux-gnu-gcc -s -Os -o test test.c
Run Code Online (Sandbox Code Playgroud)
最终的二进制文件为 66904 字节,比预期大得多。节标题如下所示:
$ powerpc-unknown-linux-gnu-readelf -S test
There are 27 section headers, starting at offset 0x10120:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 10000154 000154 00000d 00 A 0 0 1
[ 2] .note.ABI-tag NOTE …
Run Code Online (Sandbox Code Playgroud) crosstool-ng ×8
linux ×5
arm ×2
c ×2
gcc ×2
toolchain ×2
build ×1
c++ ×1
elf ×1
linux-kernel ×1
macos ×1
raspberry-pi ×1
wget ×1