2017-06-07 170 views
0

基本步驟導致該問題:GCC 4.9.4交叉編譯器編譯(limits.h中的問題)

cd linux-2.6.35.9/ 
make ARCH=x86 INSTALL_HDR_PATH=${PREFIX}/${TARGET} headers_install 
cd ../ 

cd build-binutils/ 
sh ../binutils-2.28/configure --prefix=${PREFIX} --target=${TARGET} 
make 
make install 
cd ../ 

cd build-gcc/ 
sh ../gcc-4.9.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c,c++ --disable-multilib 
make all-gcc 
make install-gcc 
cd ../ 

,我運行到的是什麼最終得到安裝到$ {PREFIX}問題/lib/gcc/${TARGET}/4.9.4/include-fixed/limits.h似乎不正確。具體來說,構建和安裝GCC中的「fixincludes」位需要某個名爲「sys-include」的目錄,該目錄永遠不會被放置,當不存在時,上述limits.h不會引用關聯的syslimits.h相同的目錄)。

如果查看構建/安裝序列的輸出,可以參考從組件limitx.h,limity.h和其他一些位構建此文件。這個測試失敗了,它只是安裝GCC附帶的「通用」limits.h(它不包括對syslimits.h的引用,它使用GCC的#include_next指令來包含$ {PREFIX}/$ {TARGET}/include/limits.h有實際東西在它我需要像NAME_MAX和PATH_MAX)。

被從文件中缺少該位:

/* This administrivia gets added to the beginning of limits.h 
    if the system has its own version of limits.h. */ 

/* We use _GCC_LIMITS_H_ because we want this not to match 
    any macros that the system's limits.h uses for its own purposes. */ 
#ifndef _GCC_LIMITS_H_ /* Terminated in limity.h. */ 
#define _GCC_LIMITS_H_ 

#ifndef _LIBC_LIMITS_H_ 
/* Use "..." so that we find syslimits.h only in this same directory. */ 
#include "syslimits.h" 
#endif 

那麼,有沒有我不傳遞給GCC的配置腳本,或者我不及格的東西提前這一步,將創建一個選項正確的sys-include目錄?

[編輯]

TARGET=i686-redhat-linux(目標從我們使用該項目的生成服務器上 「GCC -dumpmachine」 三重)

可能更多有用的信息(?):將包裝簡單的「的wget 「從各自的檔案中抽出。我正在構建最新的Ubuntu 16.04安裝,其中我安裝了libgmp-dev和libmpfr-dev,以避免必須使用編譯器源代碼編譯它們。

+0

'$ {TARGET}'的值是多少?請編輯該問題以改進它。 –

+0

用一些附加信息更新了問題。希望有所幫助! –

回答

0

經過更多的挖掘和反覆試驗,我匹配了一些我從How to Build a GCC Cross-Compiler開始的信息,其中包含了一個關於配置GCC的明顯棄用的選項--with-headers的信息。 (--with-headers=${PREFIX}/${TARGET}/include/linux)這工作,但當我建立了編譯器支持庫,它抱怨丟失bits/stdio_lim.h。我發現另一篇文章here談到了這個問題(你必須在線程中稍微介紹一下),並且提到了我提到的第一頁觸及的gnu/stubs.h

從我自己的意見下面注意到,您必須刪除在make install-gcc步驟之後構建的${PREFIX}/${TARGET}/sys-include目錄,否則您的正常C頭將與搜索中包含的Linux內核特定頭文件發生衝突路徑默認。

我只想說的是,應用補丁舊的Glibc我使用後(2.11.3)的整個序列結束了這樣的事情:

export TARGET=i686-redhat-linux 
export PREFIX=$(pwd)/output 
export PATH=${PATH}:${PREFIX}/bin 

mkdir build-binutils 
mkdir build-gcc 
mkdir build-glibc 

cd linux-2.6.35.9/ 
make ARCH=x86 INSTALL_HDR_PATH=${PREFIX}/${TARGET} headers_install 
cd ../ 

cd build-binutils/ 
sh ../binutils-2.28/configure --prefix=${PREFIX} --target=${TARGET} 
make 
make install 
cd ../ 

cd build-gcc/ 
sh ../gcc-4.9.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c,c++ --disable-multilib --with-headers=${PREFIX}/${TARGET}/include/linux 
make all-gcc 
make install-gcc 
cd ../ 
rm --recursive --force ${PREFIX}/${TARGET}/sys-include 

cd build-glibc/ 
sh ../glibc-2.11.3/configure --prefix=${PREFIX}/${TARGET} --build=$(gcc -dumpmachine) --host=${TARGET} --target=${TARGET} --disable-multilib libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes 
make install-bootstrap-headers=yes install-headers 
make csu/subdir_lib 
install csu/crt1.o csu/crti.o csu/crtn.o ${PREFIX}/${TARGET}/lib 
${TARGET}-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o ${PREFIX}/${TARGET}/lib/libc.so 
touch ${PREFIX}/${TARGET}/include/gnu/stubs.h ${PREFIX}/${TARGET}/include/bits/stdio_lim.h 
cd ../ 

cd build-gcc/ 
make all-target-libgcc 
make install-target-libgcc 
cd ../ 

cd build-glibc/ 
make 
make install 
cd ../ 

我看不出有任何的頁面實際上去了這個深度(也許Preshing on Programming頁面實際上並不完全正確?),但我要測試這個配置並確保軟件完全爲目標構建而沒有問題。 (我在一個文件中測試了NAME_MAX的limits.h並且它看起來工作得很好,很花哨。)

我也並不真的知道我需要放入--disable-multilib的東西,但那似乎是其他的東西網頁正在做。GCC郵件列表中的鏈條使用--with-newlib--disable-shared作爲選項,但線程中的人無法同意這兩種方法中的任何一種是正確的解決方案。

如果任何人有更好的洞察力,我肯定會讚賞這個問題不那麼黑客,更官方的解決方案。

如果有人想知道,補丁(有兩個)來解決的Glibc 2.11.3是爲配置腳本與GNU工作提出4+一個自定義修復:

sed -i 's/\(3.79\)/4.* | \1/' glibc-2.11.3/configure 

...和一個實際的補丁兩個庫中的文件來修復i686的詢問服務:

patch glibc-2.11.3/nptl/sysdeps/pthread/pt-initfini.c <<__EOF__ 
@@ -45,6 +45,11 @@ 
/* Embed an #include to pull in the alignment and .end directives. */ 
asm ("\n#include \"defs.h\""); 

+asm ("\n#if defined __i686 && defined __ASSEMBLER__"); 
+asm ("\n#undef __i686"); 
+asm ("\n#define __i686 __i686"); 
+asm ("\n#endif"); 
+ 
/* The initial common code ends here. */ 
asm ("\n/*@HEADER_ENDS*/"); 

__EOF__ 
patch glibc-2.11.3/sysdeps/unix/sysv/linux/i386/sysdep.h <<__EOF__ 
@@ -29,6 +29,10 @@ 
#include <dl-sysdep.h> 
#include <tls.h> 

+#if defined __i686 && defined __ASSEMBLER__ 
+#undef __i686 
+#define __i686 __i686 
+#endif 

/* For Linux we can use the system call table in the header file 
     /usr/include/asm/unistd.h 
__EOF__ 

我得到了最後的補丁從here

+0

這似乎並不足夠。問題在於GCC將在sys-include目錄中包含一堆Linux Kernel頭文件,而Linux Kernel的time.h與GCC/Glibc的time.h衝突,並且(至少)會重新定義'struct timeval'。所以,還沒有完全解決這個問題。 –

+0

因此,經過這段時間,我簡單地結束了刪除'$ {PREFIX}/$ {TARGET}/sys-include'目錄,現在一切似乎都在編譯。 (至少就我測試過的)。如果結果正確,我會編輯並更新爲答案。 –