Linux ARM交叉编译工具链制作过程

一、下载源文件

源代码文件及其版本与下载地址:

Binutils-2.19.tar.bz2

http://ftp.gnu.org/gnu/binutils/

gcc-4.4.4.tar.bz2

http://mirrors.kernel.org/gnu/gcc/gcc-4.4.4/

Glibc-2.11.2.tar.bz2

Glibc-ports-2.11.tar.bz2

http://ftp.gnu.org/gnu/glibc/

Gmp-4.2.tar.bz2

http://ftp.gnu.org/gnu/gmp/

Mpfr-2.4.0.tar.bz2

http://ftp.gnu.org/gnu/mpfr/

Linux-2.6.29.tar.bz2

Patch-2.6.29.bz2 

http://www.kernel.org/pub/linux/kernel/v2.6/

 

一般一个完整的交叉编译器涉及到多个软件,主要包括binutils、gcc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,而glibc主要提供用户程序所需要的一些基本函数库。

 

二、建立工作目录

     编译所用主机型号 FC12.i686

     第一次编译时用的是root用户(第二次用一般用户karen,该用户可以使用sudo指令)

     所有的工作目录都在/home/Karen/cross下面建立完成,首先在/home/karen目录下建立cross目录

 [root@localhost  karen] mkdir cross

进入工作目录:

[root@localhost  root]#cd /home/karen/cross           
 查看当前目录:

[root@localhost  cross ]# pwd 
/home/karen/cross 

创建工具链文件夹:

[root@localhost  cross]# mkdir embedded-toolchains

在建立了顶层文件夹embedded- toolchains,下面在此文件夹下建立如下几个目录:

Ø  setup-dir,存放下载的压缩包;

Ø  src-dir,存放binutils、gcc、glibc解压之后的源文件;

Ø  kernel,存放内核文件,对内核的配置和编译工作也在此完成;

Ø  build-dir ,编译src-dir下面的源文件,这是GNU推荐的源文件目录与编译目录分离的做法;

Ø  tool-chain,交叉编译工具链的安装位;

Ø  program,存放编写程序;

Ø  doc,说明文档和脚本文件;

    下面建立目录,并拷贝源文件。

[root@localhost  cross] #cd embedded- toolchains
[root@localhost  embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc
[root@localhost  embedded- toolchains] #ls
build-dir doc kernel program setup-dir src-dir tool-chain
[root@localhost  embedded- toolchains] #cd setup-dir

 拷贝源文件:
这里我们采用直接拷贝源文件的方法,首先应该修改setup-dir的权限

[root@localhost  embedded- toolchains] #chmod 777 setup-dir

然后直接拷贝/home/karen目录下的源文件到setup-dir目录中,如下图:

 

 建立编译目录:

[root@localhost  setup-dir] #cd ../build-dir
[root@localhost  build -dir] #mkdir build-binutils build-gcc build-glibc

三、输出环境变量

输出如下的环境变量方便我们编译。

为简化操作过程。下面就建立shell命令脚本environment-variables:
[root@localhost  build -dir] #cd ../doc
[root@localhost  doc] #mkdir scripts
[root@localhost  doc] #cd scripts
用编辑器vi编辑环境变量脚本envionment-variables:

[root@localhost  scripts] #vi envionment-variables  
export  PRJROOT=/home/mxl/diliuzhang/embedded- toolchains
export  TARGET=arm-linux
export  PREFIX=$PRJROOT/tool-chain
export  TARGET_PREFIX=$PREFIX/$TARGET
export  PATH=$PREFIX/bin:$PATH

截图如下:

 

 

%% Q:为什么用了source ./environment-variables才正常执行,去掉source就没有执行? %%

%%  如果用source 执行, 不需要脚本有执行权限, 权限为664也可以,执行命令如下:%%

%%  Source environment-variables %%

 

说明:

TARGET变量用来定义目标板的类型,以后会根据此目标板的类型来建立工具链。参

看表6-1所示。目标板的定义与主机的类型是没有关系的,但是如果更改TARGET的值,

GNU工具链必须重新建立一次。
PREFIX变量提供了指针,指向目标板工具程序将被安装的目录。
TARGET_PREFIX变量指向与目标板相关的头文件和链接库将被安装的目录。
PATH变量指向二进制文件(可执行文件)将被安装的目录。

如果不惯用环境变量的,可以直接用绝对或相对路径。如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样就不用老是export这些变量了。

体系结构和TAEGET变量的对应如下表6-1所示:

表6-1 体系结构和TAEGET变量的对应

体系结构

TARGET变量的值

PowerPC

Powerpc-linux

ARM

arm-linux

MIPS(big endian)

mips-linux

MIPS(little endian)

mipsel-linux

MIPS64

mips64-linux

SuperH3

sh3-linux

SuperH4

sh4-linux

I386

i386-linux

Ia64

ia64-linux

M68k

m68k-linux

M88k

m88k-linux

Alpha

alpha-linux

Sparc

sparc-linux

Sparc64

sparc64-linux

四、建立二进制工具(binutils)

Binutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。对这些程序的简单解释如下。

Ø  addr2line  把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。

Ø  ar  建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。

Ø  as  主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。

Ø  c++filt  连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。

Ø  gprof  显示程序调用段的各种数据。

Ø  ld  是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。

Ø  nm  列出目标文件中的符号。

Ø  objcopy  把一种目标文件中的内容复制到另一种类型的目标文件中。

Ø  objdump  显示一个或者更多目标文件的信息。使用选项来控制其显示的信息,它所显示的信息通常只有编写编译工具的人才感兴趣。

Ø  ranlib  产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。

Ø  readelf  显示elf格式可执行文件的信息。

Ø  size  列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。

Ø  strings  打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符。这个程序对于了解非文本文件的内容很有帮助。

Ø  strip  丢弃目标文件中的全部或者特定符号。

Ø  libiberty  包含许多GNU程序都会用到的函数,这些程序有getopt、obstack、strerror、strtol和strtoul。

Ø  libbfd  二进制文件描述库。

Ø  libopcode  用来处理opcodes的库,在生成一些应用程序的时候也会用到它。

Binutils工具安装依赖于Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具

下面将分步介绍安装binutils-2.19.2的过程。

[root@localhost  script] # cd $PRJROOT/src-dir
[root@localhost  src-dir] # tar jxvf ../setup-dir/binutils-2.19.tar.bz2
[root@localhost  src-dir] # cd $PRJROOT/build-dir/build-binutils
创建Makefile:

[root@localhost  build-binutils] #http://www.cnblogs.com/src-dir/binutils-2.19/configure --target=$TARGET --prefix=$PREFIX

   在build-binutils目录下面生成Makefile文件,然后执行make,make install。完成后可以在$PREFIX/bin下面看到我们的新的binutil。

注意:每个工具的文件名的前缀都是前面为TARGET变量设定的值。如果目标板arm-linux,那么这些工具的文件名前缀就会是arm-linux-。这样就可以根据目标板类型找到正确的工具程序。

  

五、建立内核头文件

在这里我们使用时2.6.29的内核版本,因为交叉工具链工具链是针对特定的处理器和操作系统的,因此在编译之前就需要对linux内核进行配制,可以通过“make config”或“make menuconfig”命令对内核进行配制,配制完成后,在linux源文件的目录下就会生成一个.config文件,这就是我们所需要的文件。

Note: 目标板的内核版本是2.6.29

 

[root@localhost  embedded- toolchains] #cd kernel

[root@localhost  kernel] #tar jxvf ../setup-dir/ linux-2.6.29.tar.bz2                
[root@localhost  kernel] #bunzip2 ../setup-dir/ patch-2.6.29.bz2 
[root@localhost  kernel] #cd linux-2.6.29
给Linux内核打补丁:

[root@localhost  linux-2.6.29] #patch –p1  <  http://www.cnblogs.com/setup-dir/patch-2.6.29

然后就是配置内核,第一步是修改Makefile

修改 Makefile:

ARCH = arm                         

CROSS_COMPILE = arm-linux- menuconfig  

接着使用make menuconfig进入内核配置菜单

或者直接写:

# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig ,注意在配置时一定要选择处理器的类型,比如我的目标机使用的处理器是OMAP类型的,就选TI OMAP:

System Type -à

         ARM System Type -à

         (x) TI OMAP

配置完退出并保存。

配置完须执行make,参数如下:

[root@localhost linux-2.6.29]# make ARCH=arm CROSS_COMPILE=arm-linux- (执行过程中有错误出现也没关系,主要目的是产生头文件version.h和autoconf.h)

执行完检查一下内核目录中的/kernel/linux-2.6.29/include/linux/version.h和autoconf.h文件是不是生成了,这是编译glibc要用到的。version.h 和 autoconf.h 文件的存在,说明你生成了正确的头文件。

接下来建立工具链需要的include目录,并将内核头文件复制过去。
[root@localhost  linux-2.6.29] #cd include
[root@localhost  include] #ln -s asm-arm asm

可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。(2.6.29已自动生成)
[root@localhost  include] #cd asm
[root@localhost  asm] #ln -s arch-epxa arch  

[root@localhost  asm] #ln -s proc-armv proc

可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。

复制头文件到交叉编译工具链的安装目录:

[root@localhost  asm] #mkdir –p $TARGET_PREFIX/include
[root@localhost asm] #cp –r $PRJROOT/kernel/linux-2.6.29/include/linux $TARGET_PREFIX/include
[root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/include/asm-arm $TARGET_PREFIX/include/asm

[root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/include/asm-generic $TARGET_PREFIX/include

root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/arch/arm/include/asm  $TARGET_PREFIX/include

root@localhost  asm] #cp –r $PRJROOT/ kernel /linux-2.6.29/arch/arm/mach-omap2/include/mach $TARGET_PREFIX/include/asm

Note: mach-xxx是根据目标板所用的cpu类型来选择的

 

六、建立初始编译器 (boot strap gcc)

这一步的目的主要是建立arm-linux-gcc工具,注意这个gcc没有glibc库的支持,所以只能用于编译内核、BootLoader等不需要C库支持的程序,后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和BootLoader,那么安装完这个就可以到此结束。安装过程如下:

  [root@localhost  build-binutils] #cd $PRJROOT/setup-dir

重命名:
[root@localhost  setup-dir] #mv gcc-core-4.4.4.tar.bz2  gcc-4.4.4.tar.bz2 
[root@localhost  setup-dir] #cd $PRJROOT/src-dir
[root@localhost  src-dir] #tar jxvf ../setup-dir/gcc-4.4.4.tar.bz2

从 GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为"gmp"和"mpfr",那么GCC的编译程序将自动将两者与GCC一起编译。建议尽可能使用最新的GMP和MPFR版本。

[root@localhost src-dir]# tar jxvf ../setup-dir/mpfr-2.4.0.tar.bz2

[root@localhost src-dir]# tar jxvf ../setup-dir/gmp-4.2.tar.bz2

[root@localhost src-dir]# mv mpfr-2.4.0 gcc-4.4.4/mpfr

[root@localhost src-dir]# mv gmp-4.2.0 gcc-4.4.4/gmp

•因为是交叉编译器,还不需要目标板的系统头文件,所以需要使用 --without-headers这个选项。否则会有很多*.h头文件找不到的报错

•--enable-language=c用来告诉配置脚本,需要产生的编译器支持何种语言,现在只需支持C语言。虽然配置为c,c++也可以的

•--disable-threads 是因为threads需要libc的支持。

•--disable-decimal-float,需要libc的支持,而我们在初步编译的时候尚未生成libc,否则出现以下的报错:

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:52:18: error: fenv.h: No such file or directory

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c: In function '__dfp_test_except':

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: 'FE_INEXACT' undeclared (first use in this function)

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: (Each undeclared identifier is reported only once

http://www.cnblogs.com/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: for each function it appears in.)

 

•--disable-shared,既然是第一次安装ARM交叉编译工具,那么本机的glibc支持的应该是本机的编译工具库,而不是ARM交叉编译工具库。forces GCC to link its internal libraries statically,没有这个选项,会有 crti.o: No such file: No such file or directory collect2: ld returned 1 exit status

:由于没有arm的glibc,需要使用--disable-libmudflap --disable-libssp,禁止两个边界检查使用的库。

同样,由于第一次安装ARM交叉编译工具,那么支持的libc库的头文件也没有,src-dir/gcc-4.4.4/gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS中添加两个定义:-Dinhibit_libc  –D__gthr_posix_h

原文:

TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC

改后:

TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D_gthr_posix.h

编译:
[root@localhost  src-dir] #cd $PRJROOT/build-dir/build-gcc

[root@localhost build-gcc]# http://www.cnblogs.com/src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-shared --disable-threads --disable-decimal-float –disable-libmudflap –disable-lipssp

 [root@localhost build-gcc]# make all-gcc

 [root@localhost build-gcc]# make install-gcc

 [root@localhost build-gcc]# make all-target-libgcc

 [root@localhost build-gcc]# make install-target-libgcc

很多资料中之有前面两项,这只建立了gcc,没有建立libgcc.a,这样会在glibc的编译中出现-lgcc没有找到的错误。报告:

……/build-tools/build-glibc/libc_pic.a

i586-linux-gcc   -nostdlib -nostartfiles -r -o /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.map.o '-Wl,-(' /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/dl-allobjs.os /home/wei/workspace/mywork/moblin/build-tools/build-glibc/libc_pic.a -lgcc '-Wl,-)' -Wl,-Map,/home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.mapT

/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/arm-linux/4.4.4/http://www.cnblogs.com/http://www.cnblogs.com/ram-linux/bin/ld: cannot find -lgcc

在glibc的编译中,还需要libgcc_eh.a(否则出现错误:-lgcc_eh没有找到……bin/ld: cannot find -lgcc_eh),使用了--disable-shared的选项,将不会生成libgcc_eh.a,可以通过对libgcc.a的链接来实现。

[root@localhost build-gcc]#  ln -vs libgcc.a `arm-linux-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`

  Note:arm-linux-gcc与-print-libgcc-file-name之间有一个空格  

 运行报告:

“/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/i586-linux/4.3.3/libgcc_eh.a” -> “libgcc.a”

装完成后,查看结果:

[root@localhost  build-gcc] #ls $PREFIX/bin 

 

如果arm-linux-gcc等工具已经生成,表示boot trap gcc工具已经安装成功

七、编译glibc

  这一步是最为繁琐的过程,目标板必须靠它来执行或者是开发大部分的应用程序。glibc套件常被称为C链接库,但是glibc实际产生很多链接库,其中之一是C链接库libc。因为嵌入式系统的限制,标准GNU C链接库显得太大,不适合应用在目标板上。所以需要寻找C链接库的替代品,在这里现以标准GNU C为例建立工具链。

[root@localhost  build-gcc] #cd $PRJROOT/src-dir
[root@localhost  src-dir] # tar jxvf ../setup-dir/glibc-2.11.2.tar.bz2
[root@localhost  src-dir] # tar jxvf ../setup-dir/glibc-ports-2.11.tar.bz2

[root@localhost  src-dir] # mv –v glibc-ports-2.11 glibc-2.11.2/ports

[root@localhost  src-dir] # cd glibc-2.11.2

[root@localhost  glibc-2.11.2] # patch –Np1 –i http://www.cnblogs.com/setup-dir/glibc-2.11.2-gcc_fix-1.patch

[root@localhost  glibc-2.11.2] # patch –Np1 –i http://www.cnblogs.com/setup-dir/glibc-2.11.2-makefile_fix-1.patch

[root@localhost  glibc-2.11.2] # cd $PRJROOT/build-dir/build-glibc

[root@localhost build-glibc] # CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib /
http://www.cnblogs.com/src-dir/glibc-2.11.2/configure /
--host=arm-linux /
--prefix=$PREFIX/$TARGET /

--with-tls --disable-profile /
--enable-add-ons /

--with-headers=$PREFIX/$TARGET/include /
libc_cv_forced_unwind=yes /
libc_cv_c_cleanup=yes /

libc_cv_arm_tls=yes

 [root@localhost build-glibc] # make

 [root@localhost build-glibc] # make install

 

   注:以上完成后,请查看一下$TARGET_PREFIX/lib目录下的文件libc.so,看看GROUP的内容是否指定到可以用于交叉编译的库,如果不是请修改,如下。

   libc.so 文件(所在目录是$TARGET_PREFIX/lib),将GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)改为GROUP ( libc.so.6 libc_nonshared.a)

这样连接程序 ld 就会在 libc.so 所在的目录查找它需要的库,因为你的机子的/lib目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 经过查看,发现libc.so中的GROUP已经是交叉编译链的目录,所以不用更改

对 libc.so 的修正·

 

vi $PREFIX /${TARGET}/lib/libc.so

 

去掉绝对路径,修改后的内容如下:

 

/* GNU ld script

 

    Use the shared library, but some functions are only in

 

    the static library, so try that secondarily. */

 

OUTPUT_FORMAT(elf32-littlearm)

 

GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) )

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

八、建立全套编译器 (full gcc)

[root@localhost  build-gcc] #http://www.cnblogs.com/src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX  --enable-languages=c,c++ --enable-shared

[root@localhost  build-gcc] #make all

[root@localhost  build-gcc] #make install

  

我们再来看看 $PREFIX/bin 里面多了哪些东西。你会发现多了 arm-linux-g++ 、和 arm-linux-c++ 几个文件。

G++-gnu的 c++ 编译器。

C++-gnu 的 c++ 编译器。

至此,整个交叉编译环境就建立完成了。

 九、完成工具链的设置

 root@localhost  build-gcc] # cd $TARGET_PREFIX/bin

查看文件是否为二进制文件:
[root@localhost  bin] # file as ar gcc ld nm ranlib strip   

查看缺省的搜寻路径:
[root@localhost  bin] #arm-linux-gcc -print-search-dirs  

  十、测试和验证交叉编译工具

    下面编写一个简单的C程序,使用建立的工具链。、
[root@localhost  bin] #cd $PRJROOT/program
[root@localhost  program] #vi hello.c
#include <stdio.h>

int main(void)

{

           printf("hello linux/n");

           return 0;

}

[root@localhost  program] #arm-linux-gcc hello.c -o hello –static (制作静态可执行文件)

 制作的可执行文件hello可以直接在目标机上运行。

 

             Karen

查看评论
2楼 xin198404 2011-03-03 18:10发表 [回复] [引用] [举报]
杯具liao...
编完后发现只有arm-linux-gcc....
发现楼主贴的步骤中在最后一步前边漏了:
1.解压gcc-g++.4.4.4
2.将t-linux中原改动的内容再改回去
后再make, make install
1楼 xin198404 2011-03-03 08:56发表 [回复]
哇,这篇很全
除一些小的改动,顺利编译通过!![e01]
http://blog.csdn.net/axdc_qa_team/article/details/6032928

转载于:https://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM开发板上iconv_open(utf-8, gb2312) 调用失败的解决方法(转)

ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法 应用程序代码如下&#xff1a;static int code_convert(char* from_charset, char* to_charset, char* inbuf, size_t inlen, char* outbuf, size_t outlen){ iconv_t cd; char…

linux c语言获取时间

在程序中&#xff0c;经常需要输出系统的当前时间、计算程序的执行时间、使用计时器等。 一、时间的类型 1.格林威治标准时间 coordinated universal time(UTC)是世界标准时间&#xff0c;即常说的格林威治标准时间(greenwich mean time,GMT). 2.日历时间 日历时间(calendar ti…

source insight快捷键及使用技巧

source insight快捷键及使用技巧 退出程序 : AltF4 重画屏幕 : CtrlAltSpace 完成语法 : CtrlE 复制一行 : CtrlK 恰好复制该位置右边的该行的字符 :…

Crosstool-ng制作交叉编译工具链

Crosstool-ng制作交叉编译工具链 交叉编译器可以用现成的&#xff0c;比如CodeSourcery制作的交叉编译器&#xff0c;也可以自己制作&#xff0c;一般是用kernelgccglibcbinutils的源码包来编译安装&#xff0c;后来由于这个太麻烦于是就有类似crosstool这样的自动化配置工具。…

数学建模之聚类模型详解

聚类模型 引言 “物以类聚&#xff0c;人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测&#xff1b;也可以探究不同类之间的相关性和主…

嵌入式Linux启动过程中的问题积累

嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Number OMAP5912 OSK # &#xff08;tftp下载好kernel的uImage后就停止在这&#xff0c;不能启动kernel&#xff09; 问题原因&#xff1a;启动参数设置错误,…

使用BusyBox制作嵌入式Linux根文件系统

STEP 1&#xff1a;构建目录结构 创建根文件系统目录&#xff0c;主要包括以下目录/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys #mkdir /home/rootfs#cd /home/rootfs #mkdir dev etc lib usr var proc tmp home root …

Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用

Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用 在串口编程模式下&#xff0c;open未设置O_NONBLOCK或O_NDELAY的情况下。 c_cc[VTIME]和c_cc[VMIN]映像read函数的返回。 VTIME定义等待的时间&#xff0c;单位是百毫秒(通常是一个8位的unsigned char变量&#xff0c;取值不能…

Linux_2.6字符设备驱动实例

第一步&#xff1a;my74hc595.c #include <linux/module.h> //模块所需的大量符号和函数定义#include <linux/init.h> //指定初始化和清除函数#include <linux/fs.h> //文件系统相关的函数和头文件#include <linux/cdev.h> //cdev结构的头文件#include…

移植mysql到嵌入式ARM平台

移植MySQL到嵌入式ARM平台 MySQL没有专门针对ARM的版本&#xff0c;移植到ARM没有官方文档可参考&#xff0c;因此&#xff0c;暂时参考这样一篇文档&#xff1a; http://blog.chinaunix.net/space.php?uid9701860&doblog&id285428&#xff0c;因为MySQL5.5之后&…

'./mysql-bin.index' not found (Errcode: 13) 的解决方法

将文件系统复制到PC机上&#xff0c;然后再拷贝到别的SD卡后&#xff0c;发现mysql无法启动了&#xff0c;首先检查了一下mysql的错误日志&#xff0c;发现最后出现以下错误&#xff1a;/usr/local/mysql/libexec/mysqld: File ./mysql-bin.index not found (Errcode: 13)提示.…

Unity Hub安装Android Build Support报错:Failed to delete old Unity Android Supprtinstallation files

安装失败&#xff1a; 解决方法&#xff1a; 需要先安装 Android Build Support &#xff0c;再安装 Android SDK & NDK Tools 和 OpenJDK 其他情况&#xff1a; 如果已经安装了Android SDK & NDK Tools 和 OpenJDK&#xff0c;只剩Android Build Support 未安装成功…

红米5 Plus刷开发版/小米手机刷开发版

到官网选择对应手机型号下载Rom包&#xff1a;MIUI下载 下载完成后手机打开&#xff1a;设置→我的设备→MIUI版本→右上角选择【手动选择安装包】&#xff0c;找到下载的包等待手机重启就行了。 PS&#xff1a;如果是像下面这样 小米手机找不到手动选择安装包 选项的话&#…

小米手机开启Root权限

1.开启权限前手机先要刷成开发版&#xff0c;可以看 → 小米手机刷开发版 2.设备解锁&#xff0c;先在 设置→我的设备→全部参数→开启开发者模式→多击MIUI版本 开启开发者模式&#xff0c;然后进入 设置→更多设置→开发者选项→设备解锁状态 &#xff0c;根据操作提示解锁…

小米手机Linux Deploy安装Ubuntu

1.Linux Deploy 2.4版本之后无需再安装Busy Box&#xff0c;所以BusyBox安装报错失败的不需要再安装了。直接GooglePlay下载inux Deploy最新版进行安装即可&#xff0c;或 点击此处下载。 2.下载安装Linux Deploy之后进行Ubuntu的安装。 我的配置如下&#xff1a; 引导设置&a…

Linux Deploy Ubuntu安装samba服务

1.更新软件源&#xff1a;sudo apt-get update 2.安装samba服务&#xff1a;sudo apt-get install samba 3.备份原配置文件&#xff1a;sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak 4.创建共享目录&#xff1a;sudo mkdir -p /共享文件夹路径 5.更新目录权限&…

摄像头监控录像保存到手机(旧手机/废弃手机)本文使用手机为红米Note5 Plus

本文为使用旧手机安装linux Ubuntu系统之后安装samba服务&#xff0c;用作NAS网络存储&#xff0c;需要摄像头软件可以将录像保存至NAS。 1.手机需要先开启 Root权限&#xff0c;小米手机可参考&#xff1a;小米手机开启Root权限-CSDN博客 2.小米手机正常开启的Root权限不是完整…

通过Blender将PMX模型转为FBX导入Unity

一、下载Blender&#xff08;建议2.83版本不要太高的&#xff09; 官网下载网址&#xff1a;Blender 2.83 LTS — blender.org 二、之后安装Blender&#xff0c;安装后下载插件 下载地址&#xff1a;https://codeload.github.com/GiveMeAllYourCats/cats-blender-plugin/zip/…

Git理论、原理、操作

Git理论、原理、操作 Git简介&#xff1a; 一个开源的分布式版本控制系统。用于处理任何大大小小的项目&#xff0c;是一个开放源码的版本控制软件。Git与SVG的区别&#xff1a; 1、git是分布式的 2、git把内容按元数据方式存储&#xff0c;svg按文件 3、git分支和svg分支不同…

我在Facebook的十点经验分享[转载]

转载自 http://blog.sina.com.cn/s/blog_70c9335b010144kc.html 我是2007年初加入Facebook, 那时大概150人; 2011年9月底离开, 当时3200多人. 经历了很多稀奇古怪但影响很大的项目, 像Application Platform, Social Ads, News Feed, Gift Shop, Facebook Credits等等. 碰到的很…