[トップ][一覧][最近の更新]

archives/2006/07

OpenBSD/dlopen

Category of OpenBSD

OpenBSDでOpenBSD-man:dlopen(0,RTLD_GLOBAL|RTLD_NOW)が常に失敗するのはなんでだろうな、と。

dlfcn.c 1.73を見る限り、

--- dlfcn.c.orig        Thu Jul 27 22:33:49 2006
+++ dlfcn.c     Thu Jul 27 22:33:33 2006
@@ -459,9 +459,9 @@
                for (i = 0; i < ehdr->e_phnum; i++) {
                        switch (phdr[i].p_type) {
                        case PT_LOAD:
-                               start = phdr[i].p_vaddr + dynobj->load_addr;
-                               if ((Elf_Addr)addr >= start &&
-                                   (Elf_Addr)addr < start + phdr[i].p_memsz)
+                               start = phdr[i].p_vaddr + dynobj->load_addr;
+                               if ((Elf_Addr)dynobj->load_dyn >= start &&
+                                   (Elf_Addr)dynobj->load_dyn < start + phdr[i].p_memsz)
                                        return dynobj;
                                break;
                        default:

でよさそうなのだが、これは他の*BSDならOKだけど、OpenBSDでは駄目な気がする。

というのも、OpenBSDのダイナミックロードされたオブジェクト(libc.soやlibm.soなど、コンパイル時に`-l'で指定された共有オブジェクト)はメモリ上へ,オブジェクトごとにランダムに配置されるために、単一のページを返しても、目的のシンボルを発見することができなくなってしまうためのようだ。さて、どうすべきかな、と。