根冲突的问题还可以理解为gcc和binutils的搜索路径和编译程序的根路径的冲突问题。第一步编译好目标系统的C库(一般为glibc)后,再编译程序就要用刚编译好的目标系统的C库了。也就是在编译时要搜索刚编译好的目标系统的C库。但这样编译出的程序的中路径就不是相对于根目录/的了。
如果我们能单指定gcc和binutils的搜索路径,不改变编译设置,这样问题不用解决了吗?
这种功能可以通过sysroot设定,在编译gcc和binutils时在configure的参数中加入--with-sysroot=<制作linux的根文件夹>,可以设置搜索路径,使编译过程中用的是指定的C库,而编译出的程序确是相对于根目录/的。
这样编译出的linux中的程序的链接器ld-linux.so.X的路径就正确了。这样就可以把制作的linux直接移到分区中启动了。
这是借鉴CLFS sysroot也可以叫CLFS3.0中的方法。
这种方法的好处是只要做好交叉编译的gcc和binutils就可以了,利用源系统中的辅助工具进行编译。用sysroot一般是在交叉编译中,同平台的本地编译是交叉编译的一个子集,可以用在交叉编译中的方法也可以用在本地编译中。