Date: Tue, 26 Aug 2008 12:01:22 -0400 From: Jim <stapleton.41@gmail.com> To: Freebsd-questions@freebsd.org Subject: fairly low level - ld-elf.so.1/rtld_verify_versions() question Message-ID: <80f4f2b20808260901w651d66dcp892b0206a03ff8b6@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
I have a library that is failing to load. Eventually I managed to play with ld-elf so I could figure out what was wrong (jail -> build the ld-elf in the jail with some printfs) Anyway, I have a lot of test cases that seem to compile/load fine, but one compiles fine but always fails to load, I found /why/ it fails, but I don't know what in my library would cause the issues. It looks like a versioning failure for libc.so.7: libc.so.7 => /lib/libc.so.7 (0x2807e000) What would cause this, but not cause failures on other libraries I've built on the same system? * Between successes and failures I have not rebuilt anything other than the successful and failing libraries. Thanks, -Jim Stapleton In case it might be useful, below I have an output from my modified ld-elf, Anything starting with ">>>" comes from the "rtld_verify_versions" function, anything starting with ">>" comes from the "dlopen" function. Anything starting with "##" is a comment or interperetation I added after the fact. #dlopen, prints name and mode arguments >>Opening: 'libctypeless.so' : 513 #prints name and pointer to main passed to load_object if name is not null >> Name not null, calling: load_object("libctypeless.so", 0x28078000 /*main*/) #prints the pointer returned for obj >> Found: 0x28078400 #tells the refcount on obj, immediately after the increment >> opened, refcount inc'ed: 1 #this is the first thing done after the initial STAILQ_FOREACH(entry, objlist, link) { #in the function, the line printing it is: # printf(">>> Checking version: %p (%p) --> \"%s\"\n", entry, entry->obj, entry->obj->path); >>> Checking version: 0x28079080 (0x28078400) --> "/usr/lib/libctypeless.so" >>> Checking version: 0x280790a0 (0x28078600) --> "/lib/libgcc_s.so.1" >>> Checking version: 0x280790c0 (0x28078200) --> "/lib/libc.so.7" #these next two are printed by #printf(">>> [shouldn't be null] strtab: \"%s\"\n", entry->obj->strtab); #and #printf(">>> [should be null] vertab: "); #printf("%p: %d / %d / \"%s\" / \"%s\" \n", entry->obj->vertab, # entry->obj->vertab->hash,entry->obj->vertab->flags, # entry->obj->vertab->name,entry->obj->vertab->file); #respectively >>> [shouldn't be null] strtab: "" >>> [should be null] vertab: 0x2807a080: 0 / 0 / "(null)" / "(null)" >> versioning failure of dagmembers: 0, libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2818e000) libc.so.7 => /lib/libc.so.7 (0x2807e000)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?80f4f2b20808260901w651d66dcp892b0206a03ff8b6>