2012-08-13 65 views
5

我目前正在更新構建系統一大堆的代碼,這恰好包括一個Linux C++項目。如果這裏的所有開發人員都可以在構建自己的想法時進行構建,那麼我會考慮是否可以在隱約現代的Linux系統上構建這個系統,儘管目標系統是2.6.18。GCC/G ++:沒有GNU唯一對象符號建設老版本的Linux內核

通過「隱約現代」我估計像GCC 4.5+的東西,在過去的一年或兩年分佈可能配。目前,我通過靜態編譯來解決libstdC++問題,並且任何glibc問題都可以通過重新映射到舊版本的memcpy符號(等等)和快速包裝代碼來巧妙地解決。到現在爲止還挺好。

我似乎無法完全弄清楚的一個問題是,從.o文件構建到可執行文件中的某些符號的類型爲'u',它是GNU獨特的對象,是ELF標準的擴展2.6.18似乎完全不承認。這意味着可執行文件不會運行,因爲它找不到符號,儘管它們實際上存在(只是'nm'中目標'?'的類型)。編譯g當

人們可以禁止使用GNU唯一對象++,但它並不完全是最方便的解決方案。編譯代碼時,我看不到任何方法禁用它(distro gcc/g ++總是有這個選項),我想想讓目標系統識別它的唯一方法是更新ld-linux和內核。這幾乎肯定不會發生。

有沒有我還沒有發現禁用這些符號類型的選項?或者也許有一些乾淨利落的方式,或者我錯過了什麼?我開始懷疑它只能在G ++ 4.1.x上編譯,這將意味着一箇舊的Linux安裝或源代碼編譯。

+0

如果這是一個動態鏈接符號類型,那麼動態鏈接器應該存在問題,而不是內核。這與內核有什麼關係? – Hibou57 2013-04-18 02:09:52

+0

雖然我還沒有嘗試過,但我認爲在不更改內核的情況下更改libld會非常困難 - 如果可能的話。所以它與內核沒有直接關係,但更多的是我必須重新編譯內核,或者只是升級整個操作系統以讓鏈接器識別這些其他符號,據我所知。 – rhickman 2013-04-25 11:59:48

回答

4

我試圖解決同樣的問題(這使我發現了這個問題),並經過了一堆的研究來沒有,你是不是缺少什麼明確的結論,有沒有辦法解決這個除了編譯你自己的g ++。請參閱GCC-幫助郵件列表上這個最近的問題:

http://gcc.gnu.org/ml/gcc-help/2013-01/msg00008.html

我比較GCC的來源,發現你可以去高達4.4的股票,如獨特的符號在4.5加入。然而,在RHEL/CentOS 6上,它們默認爲4.4,但在其中修補了獨特的符號支持,因此通常必須提防特定於分發版的gcc版本。對我來說,這是一個巨大的失望,因爲它意味着在RHEL 5上編譯的東西無法在RHEL 5上運行,即使是爲gcc 4.4 + RHEL 5製作的libstdC++的副本。

下面是消息,其中唯一符號支持宣佈,順便說一句:

http://www.redhat.com/archives/posix-c++-wg/2009-August/msg00002.html

如果你搜索你周圍就會發現,人們一直在抱怨它在其他列出了各種理由,但我想這是在這裏停留。

+0

感謝您的回覆。我只需要抱怨升級Linux內核:) – rhickman 2013-03-28 11:02:35