いけむランド

はてダからやってきました

Ruby on cygwin (2024/11月号)

前回からかなり時間が経つが、結局 SIGSEGV の謎は解けていない。*1

SIGSEGV

fd0.hatenablog.jp

gdb でいろいろ調べてみたが、どうも ExitThread のあとで SIGSEGV が発生しているようで、やっぱりさっぱりわからない状態。

github.com

learn.microsoft.com

3.2 では発生しないため、3.3 で自分が PR したあたりがもしかして原因かなと思ってるけど、stacktrace がまったく見えないため、引き続き難航している。 x86_64 環境でも試してみたが、ntdll 内の関数名が見えるだけで stack は同じように壊滅していた。

github.com

github.com

Pull Request

Avoid dangling pointer

github.com

Dl_info.dli_fnameglibc では const char* なのだが cygwin (newlib) では const char[PATH_MAX] であるため、dladdr で取得した文字列がスタックに保持されることで return 後に悲しいことになる危険性がある。

www.cygwin.com

sourceware.org

ちなみに sizeof で確認するのはどうか?というコメントもあるが、それでも OK な気はする。 コンパイル時に定数化しそうだから、パフォーマンスにも影響はなさそう。

一応、プラットフォーム毎 (Cygwin, Linux, MacOSX) に実際に sizeof(Dl_info) の結果を見てみた。

#include <dlfcn.h>
#include <stdio.h>

int main(int argc, char** argv){
    printf("sizeof(Dl_info) = %lu\n", sizeof(Dl_info));
}
$ uname -srvmpio
CYGWIN_NT-10.0-22000 3.5.4-1.x86_64 2024-08-25 16:52 UTC x86_64 unknown unknown Cygwin
$  gcc -v dlinfo.c -D_GNU_SOURCE
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/12/lto-wrapper.exe
Target: x86_64-pc-cygwin
:
$ ./a.exe
sizeof(Dl_info) = 4120
$ uname -srvmpio
Linux 6.8.0-48-generic #48-Ubuntu SMP PREEMPT_DYNAMIC Fri Sep 27 14:04:52 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ gcc -v dlinfo.c -D_GNU_SOURCE
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
:
$ ./a.out
sizeof(Dl_info) = 32
$ uname -srvmpo 
Darwin 24.1.0 Darwin Kernel Version 24.1.0: Thu Oct 10 21:05:14 PDT 2024; root:xnu-11215.41.3~2/RELEASE_ARM64_T8103 arm64 arm
$ gcc -v dlinfo.c
Apple clang version 16.0.0 (clang-1600.0.26.4)
Target: arm64-apple-darwin24.1.0
Thread model: posix
:
$ ./a.out     
sizeof(Dl_info) = 32

-municode is available for MinGW-w64 targets only

github.com

MinGW 向けのコンパイラオプションが追加されたことで Cygwinコンパイルできなくなっていた。

cygwin/Makefile.inディレクトリ名とは異なり、mingw の場合も使用するという知見を得た。

github.com

*1:吉P のせいとは口が裂けても言えない。