构建Linux笔记v1.0(第二部分)

这篇博客详细记录了构建Linux系统的过程,包括编译coreutils、linux-pam、util-linux等多个关键组件。作者强调了pam在认证中的重要性,以及在交叉编译时遇到的帮助2man的问题。此外,还提到了systemd、ncurses、findutils、vim等软件的编译和依赖关系,以及在构建过程中遇到的挑战和解决方案。
摘要由CSDN通过智能技术生成

2014-04-19 20:54:02
构建Linux 编译Linux BeagleBone Black

因为太长了,分了2部分。
构建Linux笔记v1.0(第一部分)


coreutils

->
<-

$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/coreutils/coreutils-build

也许要先编译一遍本地版的,先看下面的解释。

$ ../coreutils-8.22/configure --prefix=/usr/app/coreutils --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --enable-install-program=arch,hostname
修改Makefile,.x.1对象,$(abs_top_builddir) 改 /home/spy/Work/sources/coreutils
$ make
$ make install DESTDIR=/home/spy/Work/sources/coreutils/coreutils

--enable-install-program=arch,hostname
默认不安那2个,这样就安了。

help2man不能得到help信息

help2man: can`t get `--help` info from man/chroot.td/chroot
Try `--no-discard-stderr` if option outputs to stderr

help2man通过目标程序–help选项的输出来生成man,而我是交叉编译,目标程序不能
在我的系统中运行。所以我先编译了一遍本地版的,把运行make那个目录中的src文件夹
复制到了/home/spy/Work/sources/coreutils
重新配置成交叉编译,在make之前修改makefile文件,将help2man的目标程序指定到本地版的。

coreutils里面有我最喜欢的ls命令,编译完后,可在开发板中验证下。

linux-pam

/usr

->
<- util-linux,libcap,

$ cd /home/spy/Work/sources/pam/linux-pam-build
$ ../Linux-PAM-1.1.8/configure --prefix=/usr/app/linux-pam --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/pam/linux-pam

pam与认证有关,如果没有这个,编译util-linux的时候就不会有login。
util-linux的配置中并没有指定pam的选项,所以安装后,我把pam复制一份
放到我交叉编译器搜索库的目录中了。
我也尝试过把gcc依赖的库放到交叉编译器搜索库的目录中,但遇到了新的问题,
时间关系,没有研究。

pam的库中也有个la文件,根据pam所放的目录,做类似下面的修改。
libpam_misc.la

# Libraries that this one depends upon.
dependency_libs=` /home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/lib/libpam.la -ldl`

include/security/
我当初记录了这个东西,有点忘了,可能是依赖pam头文件的程序在那个目录找而不是include/。
编译其他程序的时候如果提示找不到头文件,可改下目录。

yywrap的问题

搜索后这个函数在flex中,安装后,我也不太会用,

conf/pam_conv1/Makefile
LIBS = -lfl

doc/specs/Makefile

还有一些其他新问题,于是换策略。

conf/pam_conv1/pam_conv_l.c

int     yywrap (void)
{
	return 1;
}

doc/specs/parse_l.c

int     yywrap (void)
{
	return 1;
}

就是在那2个c源文件中添加yywrap函数,
反正felx中有个libyywrap.c,里面的函数就这个样子。

util-linux

-> pam, ncurses
<-

我这里的编译并没有用ncurses,如果你要用的话,可先看看后面我编译ncurses的步骤。

$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/util-linux/util-linux-build

$ ../util-linux-2.24.1/configure --prefix=/usr/app/util-linux --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --without-ncurses
$ make
$ su
# make install DESTDIR=/home/spy/Work/sources/util-linux/util-linux

--without-ncurses
我当初还没编译ncurses,所以加了这个选项,我不知道ncurses是干什么的,这样等以后
出问题的时候就知道它是干什么的了。


安装时,不能改变bin/wall的用户组为tty
我采用了安装时切换用户为root的方法。

带pam库编译时

cannot find the library '/usr/app/linux-pam/lib/libpam.la' or unhandled argument '/usr/app/linux-pam/lib/libpam.la'

修改libpam_misc.la中的路径,见pam中的修改。

libcap

-> pam
<- systemd,

$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin

将makefile要引入的文件做如下修改。

CC := arm-none-linux-gnueabi-gcc
BUILD_CC := gcc
AR := arm-none-linux-gnueabi-ar
RANLIB := arm-none-linux-gnueabi-ranlib
LIBATTR := no
$ cd /home/spy/Work/sources/libcap/libcap-2.24
$ make
$ make prefix=/usr/app/libcap lib=lib FAKEROOT=/home/spy/Work/sources/libcap/libcap install

完成以上步骤,复制一份和交叉编译器的库放到一起。

systemd

/usr

-> libcap
<-

$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/systemd/systemd-build

修改configure,避免rpl_malloc的错误

  if test "$cross_compiling" = yes; then :
  ac_cv_func_malloc_0_nonnull=no 改成 yes
$ ../systemd-211/configure --prefix=/usr/app/systemd --with-rootprefix=/usr/app/systemd/root --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --disable-seccomp --disable-blkid --disable-kmod --disable-pam --disable-libcryptsetup --disable-audit --disable-acl --disable-xattr --disable-selinux --disable-xz --disable-tcpwrap --disable-gcrypt --disable-qrencode --disable-microhttpd --disable-python-devel --without-python --disable-gudev --disable-apparmor --disable-dbus
$ make
$ make install DESTDIR=/home/spy/Work/sources/systemd/systemd

--with-rootprefix=/usr/app/systemd/root
由于安装的时候会有一些东西安装在了app文件夹之外,指定这个选项为安装路径内部就可以了,
root是我随便起的,但最好与其他文件夹独立。

后面那些都是可选的软件包,我全禁用了。
今天一看,竟然有个kmod,我可以告诉你,我构建完的系统好像不能自动载入模块,也许和这个有关吧。
kmod我后面也安了。


编译时看到了很多这样的信息,不知道是什么:

libsystemd_internal_la-bus-message.o (symbol from plugin): warning: memset used with constant zero length parameter; this could be due to transposed parameters
/home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/include/bits/poll2.h: In function 'bus_poll':
/home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/include/bits/poll2.h:71:2: wa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值