前回からかなり時間が経つが、結局 SIGSEGV の謎は解けていない。*1
SIGSEGV
gdb でいろいろ調べてみたが、どうも ExitThread のあとで SIGSEGV が発生しているようで、やっぱりさっぱりわからない状態。
3.2 では発生しないため、3.3 で自分が PR したあたりがもしかして原因かなと思ってるけど、stacktrace がまったく見えないため、引き続き難航している。 x86_64 環境でも試してみたが、ntdll 内の関数名が見えるだけで stack は同じように壊滅していた。
Pull Request
Avoid dangling pointer
Dl_info.dli_fname
が glibc では const char*
なのだが cygwin (newlib) では const char[PATH_MAX]
であるため、dladdr
で取得した文字列がスタックに保持されることで return 後に悲しいことになる危険性がある。
ちなみに 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
MinGW 向けのコンパイラオプションが追加されたことで Cygwin でコンパイルできなくなっていた。