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

Disable ASLR linker option for MinGW-w64 (64-bit) #745

Closed
wants to merge 6 commits into from

Conversation

Hamayama
Copy link
Contributor

@Hamayama Hamayama commented Feb 8, 2021

  • 最近、GitHub Actions のワークフローで、Windows 64-bit (x86_64) のジョブが、
    エラー終了するようになりました。

    Unhandled error occurred during reporting an error.  Process aborted.
    
  • どうも、MSYS2 の更新で、リンカの ASLR の機能がデフォルトで ON になったらしく、
    それがトリガーになっているようです。
    https://www.msys2.org/news/#2021-01-31-aslr-enabled-by-default
    (しかし、Windows 32-bit (i686) のジョブの方は、エラーになりませんが。。。)

  • まずは、64-bit 環境の場合に、リンカのオプションで ASLR 機能を無効にするようにしました。

  • これらのオプションが、古い開発環境でエラーにならないかどうかも、少し気になりますが。。。

<テスト結果>
https://github.com/Hamayama/Gauche/actions/runs/548056283

@Hamayama
Copy link
Contributor Author

Hamayama commented Feb 8, 2021

うーむ、テストでエラーになってしまった。。。

@shirok
Copy link
Owner

shirok commented Feb 8, 2021

そもそもASLRでこけること自体がおかしいので、根本的なところを直さないとだめかも。
Windows DLLの制限回避のためにちょっと怪しいことをやっているので、そのあたりかなあ。手元で再現環境を作ってみてみます。

@Hamayama
Copy link
Contributor Author

  • まずは、切り分け的な感じで、いろいろとテストしてみました。

  • (根本的な修正方法については、まだ分からず。。。)

  • 調べた結果は、以下の通りです。

(1) 最新の MSYS2/MinGW-w64 (64-bit) 環境で、以下のエラーが出る gosh.exe ができてしまう。
Unhandled error occurred during reporting an error. Process aborted.
(たまに動くときもある) (32bit 環境では発生しない)
<開発ツールのバージョン>
gcc version 10.2.0 (Rev6, Built by MSYS2 project)
GNU ld (GNU Binutils) 2.36

(2) リンカ (ld) に -Wl,--disable-high-entropy-va フラグを渡すと、エラーを回避できる。

( https://www.msys2.org/news/#2021-01-31-aslr-enabled-by-default
では、-Wl,--disable-dynamicbase,--disable-high-entropy-va,--default-image-base-low
となっていたが、high-entropy-va だけで大丈夫なもよう )

このあたりに、関連情報あり? (英語がよく分からず)
msys2/MINGW-packages#6674
( gcc: DEP and ASLR not enabled by defaul )

msys2/MINGW-packages#7023
( weak symbols ? があると、-Wl,--default-image-base-low が必要になる? )

msys2/MINGW-packages#6986
( __declspec(dllexport) を省略していると、high-entropy-va に対応できない? )

(3) 古い MSYS2/MinGW-w64 (64-bit) 環境では、上記フラグを指定すると、今度は以下のエラーが出る。
unrecognized option '--disable-dynamicbase'
https://ci.appveyor.com/project/Hamayama/gauche/builds/37722957
→ とりあえず、configure.ac で ld --help の結果を grep して回避した。
https://ci.appveyor.com/project/Hamayama/gauche/builds/37725922

(4) Gauche のビルドで、リンカにフラグを渡すためには、現状、複数の変数を設定する必要がある。

<リンカ用の変数の調査結果>

src/Makefile.in
  LDFLAGS
  SHLIB_DYLIB_LDFLAGS (MinGW 環境では SHLIB_DYLIB_LDFLAGS は SHLIB_SO_LDFLAGS のコピー)
  SHLIB_MAIN_LDFLAGS

ext/Makefile.ext.in
  SHLIB_SO_LDFLAGS

Testing VM stack sanity - NG
  → src/test-vmstack.c
  → src/Makefile.in
       LDFLAGS

Testing utility scripts - NG
  → test static link executable - NG
  → src/build-standalone
  → lib/gauche/cgen/standalone.scm
       build-standalone
         compile-c-file
           (gauche-config "--so-cflags")
              SHLIB_SO_CFLAGS
              (SHLIB_SO_LDFLAGS は見ていない)

@shirok
Copy link
Owner

shirok commented Feb 11, 2021

調査ありがとうございます。これは貴重な情報。

@Hamayama
Copy link
Contributor Author

原因が分かったようなので、一度閉じます。

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

Successfully merging this pull request may close these issues.

2 participants