[uClibc-cvs] uClibc/test/dlopen Makefile,NONE,1.1 libtest1.c,NONE,1.1 libtest2.c,NONE,1.1 test1.c,NONE,1.1 test2.c,NONE,1.1
Erik Andersen
andersen at uclibc.org
Fri Jun 27 11:55:23 UTC 2003
Update of /var/cvs/uClibc/test/dlopen
In directory winder:/tmp/cvs-serv26970/dlopen
Added Files:
Makefile libtest1.c libtest2.c test1.c test2.c
Log Message:
Add a test which shows off the broken spots in our dlopen implementation
--- NEW FILE: Makefile ---
# Makefile for uClibc
#
# Copyright (C) 2000,2001 Erik Andersen <andersen at uclibc.org>
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU Library General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
# details.
#
# You should have received a copy of the GNU Library General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
TESTDIR=../
include $(TESTDIR)/Rules.mak
all: run
test1: test1.c
$(CC) $(CFLAGS) -o test1 test1.c -ldl
test2: test2.c
$(CC) $(CFLAGS) -o test2 test2.c -ldl
libtest1.o: libtest1.c
$(CC) $(CFLAGS) -fPIC -c libtest1.c -o libtest1.o
libtest2.o: libtest2.c
$(CC) $(CFLAGS) -fPIC -c libtest2.c -o libtest2.o
libtest1.so: libtest1.o
$(CC) $(CFLAGS) -fPIC -shared -o libtest1.so -Wl,-soname,libtest1.so libtest1.o ./libtest2.so
libtest2.so: libtest2.o
$(CC) $(CFLAGS) -fPIC -shared -o libtest2.so -Wl,-soname,libtest2.so libtest2.o
run: libtest2.so libtest1.so test1 test2
@echo "----------running test 1--------------"
-LD_LIBRARY_PATH=`pwd`:. ./test1
@echo "----------running test 2--------------"
-LD_LIBRARY_PATH=`pwd`:. ./test2
clean:
rm -f *.o libtest1.so* libtest2.so* test1 test2
--- NEW FILE: libtest1.c ---
#include <stdio.h>
extern int libtest2_func(const char *s);
void __attribute__((constructor)) libtest1_ctor(void)
{
printf("I am the libtest1 constructor!\n");
}
void __attribute__((destructor)) libtest1_dtor(void)
{
printf("I am the libtest1 destructor!\n");
}
void __attribute__((weak)) function1(void)
{
printf("libtest1: I am function1 from libtest1!\n");
}
void function2(void)
{
printf("libtest1: I am overriding function2!\n");
}
int dltest(const char *s)
{
printf( "libtest1: function1 = %p\n"
"libtest1: function2 = %p\n",
function1, function2);
function1();
function2();
return(libtest2_func(s));
}
--- NEW FILE: libtest2.c ---
#include <stdio.h>
#include <pthread.h>
extern int __pthread_mutex_init (void);
void __attribute__((constructor)) libtest2_ctor(void)
{
printf("I am the libtest2 constructor!\n");
}
void __attribute__((destructor)) libtest2_dtor(void)
{
printf("I am the libtest2 destructor!\n");
}
void function1(void)
{
printf("libtest2: I am overriding function1!\n");
}
void __attribute__((weak)) function2(void)
{
printf("libtest2: I am function2 from libtest2!\n");
}
int libtest2_func(const char *s)
{
function1();
function2();
printf( "libtest2: function1 = %p\n"
"libtest2: function2 = %p\n"
"libtest2: message from main() = '%s'\n",
function1, function2, s);
return 0;
}
--- NEW FILE: test1.c ---
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#ifdef __UCLIBC__
extern void _dlinfo(void);
#endif
int main(int argc, char **argv) {
void *handle;
int (*mydltest)(const char *s);
char *error;
handle = dlopen ("./libtest1.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "Could not open ./libtest1.so: %s\n", dlerror());
exit(1);
}
mydltest = dlsym(handle, "dltest");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "Could not locate symbol 'dltest': %s\n", error);
exit(1);
}
mydltest("hello world!");
dlclose(handle);
return EXIT_SUCCESS;
}
--- NEW FILE: test2.c ---
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#ifdef __UCLIBC__
extern void _dlinfo(void);
#endif
int main(int argc, char **argv) {
void *handle;
int (*mydltest)(const char *s);
char *error;
handle = dlopen ("./libtest2.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "Could not open ./libtest2.so: %s\n", dlerror());
exit(1);
}
handle = dlopen ("./libtest1.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "Could not open ./libtest1.so: %s\n", dlerror());
exit(1);
}
mydltest = dlsym(handle, "dltest");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "Could not locate symbol 'dltest': %s\n", error);
exit(1);
}
mydltest("hello world!");
dlclose(handle);
return EXIT_SUCCESS;
}
More information about the uClibc-cvs
mailing list