Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

埋め込みファイルの数が多いとARMHFでビルドエラーが出る #132

Closed
Hiroshiba opened this issue May 15, 2022 · 6 comments

Comments

@Hiroshiba
Copy link
Member

Hiroshiba commented May 15, 2022

不具合の内容

埋め込みファイルの数が多いとarmhfビルドがエラーになります。

現象・ログ

実際のビルドログはこちらです https://github.com/Hiroshiba/voicevox_core/runs/6438083012?check_suite_focus=true

一部抜粋してみます。

Run cmake --build . --config Release

...

/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.30 assertion fail ../../bfd/elf32-arm.c:9509
/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.30 assertion fail ../../bfd/elf32-arm.c:9509
/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.30 assertion fail ../../bfd/elf32-arm.c:9509
/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.30 assertion fail ../../bfd/elf32-arm.c:9509
/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.30 assertion fail ../../bfd/elf32-arm.c:9509
/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.30 assertion fail ../../bfd/elf32-arm.c:9509
/usr/lib/gcc-cross/arm-linux-gnueabihf/8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.30 assertion fail ../../bfd/elf32-arm.c:9509
collect2: error: ld returned 1 exit status
make[2]: *** [core/libcore.so] Error 1
make[1]: *** [core/CMakeFiles/core.dir/all] Error 2
make: *** [all] Error 2
core/CMakeFiles/core.dir/build.make:829: recipe for target 'core/libcore.so' failed
CMakeFiles/Makefile2:115: recipe for target 'core/CMakeFiles/core.dir/all' failed
Makefile:135: recipe for target 'all' failed
Error: Process completed with exit code 2.

再現手順

ブランチはこちらです

  • DECODEなどのモデルを大量にembedする
  • ビルドする
  • エラーが出る

期待動作

エラーが出ずにビルドできる

OSの種類/ディストリ/バージョン

linux armhf

その他

新しいキャラクター追加のためにモデルを足したところエラーに遭遇しました。
解決が難しそうであれば、いったんarmhfをビルドから外したいと思います。

@Hiroshiba
Copy link
Member Author

Hiroshiba commented May 15, 2022

埋め込み周りにお詳しそうな @Oyaki122 さん、もしなにかわかる点あれば・・・!

それとこちらのissueで大変お世話になった @Lapis256 さんも、もしわかる点あればぜひ・・・!

@Hiroshiba
Copy link
Member Author

製品版のもち子さんが増えるタイミングでarmhf版がビルドできなくなるので、こちらの問題が解決するまで製品版のarmhfはいったん配布しない形式となりそうです。

@Hiroshiba
Copy link
Member Author

0.12.3のビルドから提供を停止しました。

@aoirint
Copy link
Member

aoirint commented Jun 27, 2022

埋め込みの実装はよくわかっていないですが、binutilsのソースコードを見に行ってみました。

対応するエラー(Assetion Error)を出している行 (bfd/elf32-arm.c:L9509): https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=bfd/elf32-arm.c;h=0b250cea270bcbf9e823c29ab0ad7a0de498ce76;hb=8db5daf9efe8a6174d3b10ac7bba8c178836e9ce#l9509

/* Calculate the displacement between the PLT slot and the
   entry in the GOT.  The eight-byte offset accounts for the
   value produced by adding to pc in the first instruction
   of the PLT stub.  */
got_displacement = got_address - (plt_address + 8);

...

if (!elf32_arm_use_long_plt_entry)
  {
    BFD_ASSERT ((got_displacement & 0xf0000000) == 0);

...

elf32_arm_use_long_plt_entryというフラグが立っていればassertionを回避できそう?

このフラグを有効化する関数bfd_elf32_arm_use_long_plt(void)を呼び出しているのは、ld/emultempl/armelf.em:L773で、

たどるとldに--long-pltというオプションを渡せればよさそう?

CMakeLists.txtの指定でgccに-Xlinker --long-pltが渡るようにしてビルドしてみたところ、再現手順のブランチと同じ変更 Hiroshiba@d6a7dd8 をして aoirint@6d4640e ビルドは通るようになりました。

@Hiroshiba
Copy link
Member Author

おー!!!

実装も見てみました!
--long-pltの別の影響が少し不安ですが、影響があってもARMHFだけなので、良さそうな気がしました!!

@Hiroshiba
Copy link
Member Author

↑のPRでビルドできるようになったのでcloseします!ありがとうございました!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants