Date: Mon, 31 May 2010 14:20:08 GMT From: David Naylor <naylor.b.david@gmail.com> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/140143: [patch] dlopen(3) doesn't promote RTLD_GLOBAL for linked libraries Message-ID: <201005311420.o4VEK8hE015532@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/140143; it has been noted by GNATS. From: David Naylor <naylor.b.david@gmail.com> To: bug-followup@freebsd.org Cc: Subject: Re: bin/140143: [patch] dlopen(3) doesn't promote RTLD_GLOBAL for linked libraries Date: Mon, 31 May 2010 16:14:30 +0200 --Boundary-00=_IR8AMGi1UODzM2B Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Attached is an undated test case. Extract and run make. This works without failure under Linux but fails under FreeBSD. --Boundary-00=_IR8AMGi1UODzM2B Content-Type: application/x-shar; name="rtld_global.shar" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="rtld_global.shar" # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # rtld_global # rtld_global/Makefile # rtld_global/libmaster.c # rtld_global/main.c # rtld_global/libslave.c # rtld_global/common.h # rtld_global/libplugin.c # echo c - rtld_global mkdir -p rtld_global > /dev/null 2>&1 echo x - rtld_global/Makefile sed 's/^X//' >rtld_global/Makefile << '54185eeffb995a36288ad17f38c2bdc0' X.ORDER: test clean X.SUFFIXES: .a .c .o .so .so.1 X.SILENT: X XCFLAGS=-Wall -rdynamic X X.if defined(TRIGGER) XCFLAGS+=-DTRIGGER X.endif X XCC=cc XAR=ar XLN=ln X Xall: clean X echo "Running test without linking: " X ${MAKE} test clean #> /dev/null X echo "done" X echo X echo "Running test with linking: " X ${MAKE} test clean -DLINKED #> /dev/null X echo "done" X echo X echo "Running test with linking (trigger): " X ${MAKE} test clean -DLINKED -DTRIGGER X echo "done" X Xclean: X rm -f *.a *.o *.so* main X Xtest: main libmaster.so libslave.so X env LD_LIBRARY_PATH=${PWD} ./main X X.c.o: X ${CC} ${CFLAGS} -c -fPIC -o $@ $< X X.c.so: X ${CC} ${CFLAGS} -fPIC -shared -Wl,-soname,$@ -o $@ $< X X.if defined(LINKED) Xlibplugin.so: libplugin.c libmaster.so X ${CC} ${CFLAGS} -DLINKED -fPIC -L. -lmaster -shared -Wl,-soname,$@ -o $@ $< X.endif X Xmain: main.o libplugin.so X cc ${CFLAGS} -o main main.o 54185eeffb995a36288ad17f38c2bdc0 echo x - rtld_global/libmaster.c sed 's/^X//' >rtld_global/libmaster.c << '4c7e49ccff36dd33ab5357b611fe5d83' X#include "common.h" X Xint master_func() { X void* libslave; X func_t func; X X printf("libmaster: opening libslave:"); X libslave = dlopen("libslave.so", RTLD_NOW); X STATUS_CHECK(libslave); X X printf("libmaster: getting symbol 'libslave::slave_func':"); X func = (func_t)dlsym(libslave, "slave_func"); X STATUS_CHECK(func); X X printf("libmaster: calling 'libslave::slave_func'...\n"); X return func(); X} X Xconst char* master_name() { X return "libmaster.1"; X} 4c7e49ccff36dd33ab5357b611fe5d83 echo x - rtld_global/main.c sed 's/^X//' >rtld_global/main.c << 'cb6b43e30862d408f1380a58a3050ed8' X#include "common.h" X Xint main(int argc, char** argv) { X void* libplugin; X func_t func; X X printf("main: opening libplugin:"); X libplugin = dlopen("libplugin.so", RTLD_LAZY /*| RTLD_GLOBAL*/); X STATUS_CHECK(libplugin); X X printf("main: getting symbol 'libplugin::plugin_func':"); X func = (func_t)dlsym(libplugin, "plugin_func"); X STATUS_CHECK(func); X X printf("main: calling 'libplugin::plugin_func'...\n"); X return func(); X} cb6b43e30862d408f1380a58a3050ed8 echo x - rtld_global/libslave.c sed 's/^X//' >rtld_global/libslave.c << '6027f0c5e11bc3f1d64c5398f3095d35' X#include <stdio.h> X X/* Forward declaration from libmaster */ Xconst char* master_name(); X Xint slave_func() { X printf("libslave: %s\n", master_name()); X return 0; X} 6027f0c5e11bc3f1d64c5398f3095d35 echo x - rtld_global/common.h sed 's/^X//' >rtld_global/common.h << '96ded3809880f52ca04e85b8175d157f' X#include <dlfcn.h> X#include <stdio.h> X X#define STATUS_CHECK(var) \ X if ((var) == NULL) { \ X printf(" failure (%s)\n", dlerror()); \ X return 1; \ X } else \ X printf(" success\n") X Xtypedef int (*func_t)(); 96ded3809880f52ca04e85b8175d157f echo x - rtld_global/libplugin.c sed 's/^X//' >rtld_global/libplugin.c << 'a806cc4670bd702634b1d6e2d06150e5' X#include "common.h" X X#ifdef LINKED Xint master_func(); X#endif X Xint plugin_func() { X func_t func; X X#if !defined(LINKED) X void* libmaster; X X printf("libplugin: opening libmaster:"); X libmaster = dlopen("libmaster.so", RTLD_LAZY | RTLD_GLOBAL); X STATUS_CHECK(libmaster); X#elif !defined(TRIGGER) X void* libplugin; X X printf("libplugin: exposing symbols globally:"); X libplugin = dlopen("libplugin.so", RTLD_NOLOAD | RTLD_GLOBAL); X STATUS_CHECK(libplugin); X#else X void* libmaster; X X printf("libplugin: exposing libmaster symbols globally:"); X libmaster = dlopen("libmaster.so", RTLD_NOLOAD | RTLD_GLOBAL); X STATUS_CHECK(libmaster); X#endif X X#if !defined(LINKED) X printf("libplugin: getting symbol 'libmaster::master_func':"); X func = (func_t)dlsym(libmaster, "master_func"); X STATUS_CHECK(func); X#else X func = &master_func; X#endif X X printf("libplugin: calling 'libmaster::master_func'...\n"); X return func(); X} a806cc4670bd702634b1d6e2d06150e5 exit --Boundary-00=_IR8AMGi1UODzM2B--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005311420.o4VEK8hE015532>