Date: Fri, 12 Feb 1999 10:28:33 -0600 From: "Eric L. Hernes" <erich@lodgenet.com> To: hackers@FreeBSD.ORG Cc: erich@lodgenet.com Subject: dlopen and ELF v. a.out Message-ID: <199902121628.KAA29685@jake.lodgenet.com>
next in thread | raw e-mail | index | archive | help
This is a multipart MIME message.
--==_Exmh_-7836634220
Content-Type: text/plain; charset=us-ascii
I've been looking at x11amp, and I've run into a bit of a problem.
The program is set up as a program and a few shared-library plug-ins.
The shared libs all have some common symbol names in global scope,
(obviously) to provide an interface between the program and the plugin.
What happens, though is that the plug-ins aren't very well encapsulated,
so there's big time global symbol polution. If the plug-ins were contained
in one .c module, I could just declare the offending symbols as static,
and all would be fine. But the plug-ins are often aggregates where
some symbols need to be seen from different c-sources.
So is there any way to get the linker to export only specific symbols,
and hide the rest (and resolve them internally to the lib)?
Attached is a test prog that illustrates the problem. There is two
source files, a ldsoTest.c, that is the main program that dlopen()s
three `plug-ins'. Each plugin is compiled from the same test.c source
with different pre-processor defines to get a different message.
If the programs are compiled a.out, it works as desired. But if
I build with ELF, it's not right.
Here's the output when I run it: (code attached below)
(ttyp1@jake)$ env OBJFORMAT=aout make
cc -O -pipe -g -shared -o test0.so -DTST_MESSAGE="\"This is test 0"\" test.c
cc -O -pipe -g -shared -o test1.so -DTST_MESSAGE="\"This is test 1"\" test.c
cc -O -pipe -g -shared -o test2.so -DTST_MESSAGE="\"This is test 2"\" test.c
cc -O -pipe -g -o ldsoTest ldsoTest.c
(ttyp1@jake)$ ./ldsoTest
got fp at 0x200170f0
message: This is test 0
got fp at 0x200970f0
message: This is test 1
got fp at 0x200990f0
message: This is test 2
(ttyp1@jake)$ make clean
rm -f test0.so test1.so test2.so ldsoTest
(ttyp1@jake)$ env OBJFORMAT=elf make
cc -O -pipe -g -shared -o test0.so -DTST_MESSAGE="\"This is test 0"\" test.c
cc -O -pipe -g -shared -o test1.so -DTST_MESSAGE="\"This is test 1"\" test.c
cc -O -pipe -g -shared -o test2.so -DTST_MESSAGE="\"This is test 2"\" test.c
cc -O -pipe -g -o ldsoTest ldsoTest.c
(ttyp1@jake)$ ./ldsoTest
got fp at 0x280d2288
message: This is test 0
got fp at 0x280d4288
message: This is test 0
got fp at 0x280d6288
message: This is test 0
--==_Exmh_-7836634220
Content-Type: text/plain ; name="test.c"; charset=us-ascii
Content-Description: test.c
Content-Disposition: attachment; filename="test.c"
#include <stdio.h>
char *msg = TST_MESSAGE;
char *
testFunction(void){
return msg;
}
--==_Exmh_-7836634220
Content-Type: text/plain ; name="ldsoTest.c"; charset=us-ascii
Content-Description: ldsoTest.c
Content-Disposition: attachment; filename="ldsoTest.c"
#include <dlfcn.h>
#include <stdio.h>
#include <unistd.h>
typedef char *fcn(void);
int
main(int ac, char **av){
int i;
char *pn;
char *cwd=getwd(NULL);
void *h;
fcn *fp;
char *m;
for(i=0;i<3;i++) {
asprintf(&pn, "%s/test%d.so", cwd, i);
h = dlopen(pn, RTLD_NOW);
if (h) {
fp = dlsym(h, "testFunction");
if (fp){
fprintf(stderr, "got fp at %p\n", fp);
m = fp();
fprintf(stderr, "message: %s\n", m);
}
} else {
warn("%s: dlopen failed", pn);
}
free(pn);
}
return 0;
}
--==_Exmh_-7836634220
Content-Type: text/plain ; name="Makefile"; charset=us-ascii
Content-Description: Makefile
Content-Disposition: attachment; filename="Makefile"
CFLAGS+=-g
BINS=test0.so test1.so test2.so ldsoTest
all: ${BINS}
ldsoTest: ldsoTest.c
${CC} ${CFLAGS} -o $@ $<
test0.so: test.c
${CC} ${CFLAGS} -shared -o $@ -DTST_MESSAGE="\"This is test 0"\" test.c
test1.so: test.c
${CC} ${CFLAGS} -shared -o $@ -DTST_MESSAGE="\"This is test 1"\" test.c
test2.so: test.c
${CC} ${CFLAGS} -shared -o $@ -DTST_MESSAGE="\"This is test 2"\" test.c
clean:
rm -f ${BINS}
--==_Exmh_-7836634220
Content-Type: text/plain; charset=us-ascii
Eric L. Hernes
erich@lodgenet.com
--==_Exmh_-7836634220--
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199902121628.KAA29685>
