[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