上回说到发现了一个神奇的项目LFS,从官网上可以看到,这个项目是教你怎么完全用源码编译一个自已定制化的Linux系统.这跟我们之前说的安装运行多个Glibc有什么联系呢? 来来来,前情提要,上篇 讲到在程序运行的时候会依赖很多动态库,其中Glibc就是一个非常重要的库,程序通过加载ld-linux.so库对这些依赖库的路径进行查找.而ld-linux.so的路径是写死在编译器gcc中的,换一句话说,就是在一个程序在编译的时候,默认情况下它需要加载的ld-linux.so路径已经写死了(这里编译Glibc的时候会生成对应版本的ld-linux.so文件的,所以不同版本的Glibc会生成版本的ld-linux.so哦). 所以需要运行多个版本的Glibc,有两个方法,一个是在编译新的程序时通过-Wl,–dynamic-linker= 参数指定ld-linux.so路径指向其它版本 ,第二是修改gcc源码中ld-linux.so的路径,再用修改过的gcc编译新的程序,这样编译出来的所有程序ld-linux.so的路径都会指向其它版本生成的了.很容易看出来
Tag: LFS
在一个系统中安装运行多个版本的Glibc-原理篇
又好久没有更新博客了……… 这是一个困扰了我好久好久的问题.首先我们来说一下需求,我们需要在同一台linux主机上安装和运行多个版本的Glibc,为什么呢? 不知道大家有没有遇到这种情况,一般在公司里,多人共享一台开发机,开发编译都在同一台机子上,每个人需要安装一些自已喜欢的软件,比如tmux,ycm之类的,但是安装软件的时候又不想要影响其它人的工作,所以一般都是自已编译安装在自已的home目录下,然后修改自已用户的$PATH环境变量,事情到这里应该是比较顺利的. 但是呢,大部分公司的开发编译机呢,由于历史的原因,上面的各种库的版本都比较老,由于升级成本比较高,所以线上跑的程序依赖库的版本也是比较老的版本,所以你想要在开发编译机上安装一些比较新工具,体验一下新特性什么的,由于一些库的版本太低,就没有办法了.(就例如YCM,目前依赖最低的Glibc是2.14,但是很多公司的机器Glibc的版本是2.3,2.9,2.12…所以就gg了…) 一个比较
LFS编译gcc出错GCC_NO_EXECUTABLES解决
在公司的开发机自己编译一套环境,读LFS时需要重新编译gcc 公司开发机的gcc版本比较低 4.1.2 按照LFS上说的编译时加参数–target=$LFS_TGT,目的是要让编译出来的可执行文件都带$LFS_TGT的前缀,以跟原来系统中的文件区分 但是在这里编译的时候会有出错 configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES google了好久都没有找到怎么解决,再看configure check出来的信息,build和host的值和刚才target设置的值是不相同的, 是不是这里需要相同呢? 再configure的时候加上 —build=$LFS_TGT –host=$LFS_TGT再编译一下果断可以了,呃..这个真不清楚是啥原因