Bug #2585

POWER7 + gcc 4.4.7 でビルドエラーになる

Added by Susumu Yata almost 3 years ago. Updated almost 3 years ago.

Status:やらないStart date:06/04/2014
Priority:NormalDue date:
Assignee:-% Done:

0%

Category:-
Target version:-

Description

概要

※ これは問題の解決後に作成されたチケットです.

SHIBA さんから以下のエラー報告がありました.

buildbotのこちらの環境でビルドエラーになっているみたいなんですが、ちょっと見て頂くことはできますでしょうか?
https://buildbot.askmonty.org/buildbot/builders/power01/builds/185/steps/compile/logs/stdio
こちらはPower7のサーバで、ppc64版のRed Hat 6.5がインストールされているそうです。

エラー箇所を抜き出すと,以下のようになっています.

Linking CXX shared library libgroonga.so
CMakeFiles/libgroonga.dir/nfkc.c.o: In function `grn_nfkc_map2':
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:80220:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1c9d0
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:80022:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1c800
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:74239:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1a1e0
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:80231:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1c9f8
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:80228:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1c9f0
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:80220:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1c9e8
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:80220:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1c9d8
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:80220:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+1c9e0
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:70405:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+188b0
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:66575:
 relocation truncated to fit: R_PPC64_TOC16_DS against `.toc'+16f80
/home/buildbot/maria-slave/power01/build/storage/mroonga/vendor/groonga/lib/nfkc.c:64660:
 additional relocation overflows omitted from the output
collect2: ld returned 1 exit status
make[2]: *** [storage/mroonga/vendor/groonga/lib/libgroonga.so] Error 1
make[1]: *** [storage/mroonga/vendor/groonga/lib/CMakeFiles/libgroonga.dir/all] Error 2
make: *** [all] Error 2

History

#1 Updated by Susumu Yata almost 3 years ago

当初は nfkc.c の最適化が厳しいからかと考えられましたが,エラーメッセージをウェブで検索してみると,以下のページが見つかりました.

そこからさらに,以下のページにたどり着きました.

nfkc.c では定数文字列を大量に使っているのですが,それがどうやら古い gcc の制限にかかっていたようです.

I'll note that Alan just added support for two new ppc64 code models that should help,
but they won't be available in an official FSF GCC release, until GCC 4.6. 
The code models for ppc64 are now:

  1) -mcmodel=small [-mminimal-toc]    # Ie, the old ppc64 code model.
  2) -mcmodel=medium                   # The new default in GCC 4.6
  3) -mcmodel=large

Alan's original patch submission describes the different options (there
have been multiple changes made since that post):

    http://gcc.gnu.org/ml/gcc-patches/2010-06/msg00747.html

The new GCC code model support requires a newish binutils, where Alan has added
some linker optimizations when the TOC offsets are small.  Search for "large
toc" in the binutils mailing list.

#2 Updated by Susumu Yata almost 3 years ago

  • Status changed from 新規 to 完了チェック待ち
  • % Done changed from 0 to 90

結論

解決方法としては, gcc のバージョンを上げる案と,定数文字列の数を減らすという案が考えられました.

しかし,この問題は POWER + gcc (< 4.6) という環境でのみ起きることであり,そのためだけに nfkc.c を生成し直す(※)のはコストが大きすぎるという判断により, gcc のバージョンを上げることで対処することになりました.

※ 生成プログラムを再設計する必要があります.

ただ, nfkc.c の作り直しを検討した段階において, nfkc.c の実装が最新の Unicode に対応できていないことが判明しました. これについては,余裕のあるときにでも修正できればと思います.

#3 Updated by Kouhei Sutou almost 3 years ago

NFKCが最新のUnicodeに対応していないのは気づいていて、今はUnicode 5.1です。なので、NFKCを使うノーマライザー名はNormalizerNFKC51になっています。

対応するUnicodeのバージョンをあげるときは別のノーマライザーをNormalizerNFKC63とかとして別途作って今のnfkc.cとNormalizerNFKC51は残しておくのがよいと思います。理由は互換性を維持するためです。

NormalizerAutoは内部的にNormalizerNFKC51を使っているんですが、そっちは最新のNormalizerNFKCを使うようにしてもよいと思います。バージョンを固定したい人はNormalierNFKCXXを明示的に指定してね、みたいな感じで。

#4 Updated by Susumu Yata almost 3 years ago

なるほど!ありがとうございます.

nfkc.c と同様のものをバージョン別に用意するのは(特にビルド時間が)厳しいため,やるとすれば何かうまい方法を別に考える必要がありそうですね.

#5 Updated by Susumu Yata almost 3 years ago

  • Status changed from 完了チェック待ち to やらない
  • % Done changed from 90 to 0

gcc のバージョンを上げることで対処したので,「やらない」に変更します.

Also available in: Atom PDF