使用glibc在没有root的非标准位置构建GCC

时间:2012-12-01 17:04:07

标签: linux gcc glibc

我有一个我没有root权限的系统,但我需要安装当前版本的GCC(4.7.2)。

系统正在运行Linux 2.6.18的x86_64版本,并且已经有GCC 4.1(尽管--version说它是用它构建的,但没有C ++支持)。

编辑5:此时,以下步骤只是我尝试过的一组事情。从那时起我已经开始清洁了几次。我正在寻找有人详细说明我需要使用所有开关所需的确切顺序。

这是我到目前为止所经历的过程(ROOT是我主目录中的文件夹)

    make-3.82>./configure --prefix=$ROOT && make && make install && hash -r
binutils-2.23>./configure --prefix=$ROOT && make && make install
autoconf-2.69>./configure --prefix=$ROOT && make && make install
automake-1.9>./configure --prefix=$ROOT && make && make install
flex-2.5.37>./configure --prefix=$ROOT && make && make install
libunwind-1.1>./configure --prefix=$ROOT && make && make install
gcc-4.7.2-scratch>../gcc-4.7.2/configure --prefix=$ROOT \
    --disable-multilib --disable-nls --enable-languages=c,c++ \
    && make && make install && hash -r
ncurses-5.9>./configure --prefix=$ROOT && make && make install
texinfo-4.13>./configure --prefix=$ROOT && make && make install
glibc-2.14-scratch>touch $ROOT/etc/ld.so.conf

使用来自http://sourceforge.net/apps/trac/unattended/wiki/ModifyingTheBootDisk#PatchGLibc的补丁修补glibc(纠正2.14的行号)

glibc-2.14-scratch>../glibc-2.14/configure --prefix=$ROOT \
    --with-headers=$3_3_4_HEADERS && make && make install

我添加的标志是摆脱undefined reference to '__isoc99_sscanf'。我不知道实际需要哪种标志组合来修复它,但它解决了这些标志的问题。

gcc-4.7.2-scratch2>../gcc-4.7.2/configure --prefix=$ROOT \ 
    --disable-multilib --disable-nls --enable-languages=c,c++ \
    CPPFLAGS="-I$ROOT/include" CFLAGS="-g -O2 -lc" \
    CXXFLAGS="-g -O2 -lc" LDFLAGS="-L$ROOT/lib \
    -L$ROOT/lib64" && make && make install

现在我在GCC构建期间收到此错误:

build/genmddeps ../../gcc-4.7.2/gcc/config/i386/i386.md > tmp-mddeps
build/genmddeps: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by build/genmddeps)

错误是有道理的,因为/ lib64中的libc是2.5版本,但我不知道如何让GCC使用我安装到$ ROOT / lib的那个。

编辑1:添加-rpath没有帮助,但我将我的lib目录添加到LD_RUN_PATH和LD_LIBRARY_PATH。有了这些设置,我无法运行任何东西,因为我收到了错误[program_name]: error while loading shared libraries: /home/mrambiguous/root/lib/libc.so.6: ELF file OS ABI invalid

另一个值得注意的奇怪事项是,当我尝试-rpath建议时,我开始从GCC获得有关无法识别的命令行选项(例如-V)的错误。我不得不将其设置为使用系统的GCC 4.1。现在我不确定我的第一个GCC版本是否在某种程度上被破坏了,或者它是否曾被首先使用过。

编辑2:我刚刚在vim中打开了libc.so.6,看看我是否可以用纯文本找到关于ABI的任何内容,并且它在那里有版权信息。 libc ABIs: UNIQUE IFUNC

它还证实了GCC 4.7.2正在同一块文本中工作。 Compiled by GNU CC version 4.7.2

编辑3:删除了$ ROOT,重新安装了所有内容,同样的问题是无法识别-V和-qversion作为有效选项。

编辑4:我尝试使用brandelf -t SVR4 libc.so.6编辑ELF标题,但这只是给我一个新错误unexpected PLT reloc type 0x25

1 个答案:

答案 0 :(得分:4)

我很着急所以我无法详细分析您的错误消息。

较新的glibc和旧的glibc不仅ABI不兼容,而且还有标题,请参阅gcc bug 52922

因此,任何混音都会导致你遇到的错误,你需要非常小心。

手动调整是绝对乏味的。

如果您的目标是使用gcc-4.7.2,我建议您Gentoo Prefix。我有许多在RHEL 5上运行的Gentoo Prefix实例(其中包含2.6.18内核,gcc-4.1和glibc-2.5)。这将在glibc-2.5之上编译gcc-4.7.2。

如果您想要使用更新的glibc,请查看Prefix/libc。这是一项正在进行中的工作。期待很多破损。但是,当你试图手工编译出现代工具链时,它不会是一个很大的缺点,是吗?