Patches for BSDI dlsym stupidity

This commit is contained in:
hag 1996-11-17 18:49:56 +00:00
parent 9f7d624413
commit 4ba01266de
4 changed files with 92 additions and 28 deletions

61
configure vendored
View File

@ -1879,13 +1879,52 @@ else
fi fi
echo "$ac_t""$s48_cv_uscore" 1>&6 echo "$ac_t""$s48_cv_uscore" 1>&6
rm -f conftest.c a.out
if test $s48_cv_uscore = yes; then if test $s48_cv_uscore = yes; then
cat >> confdefs.h <<\EOF cat >> confdefs.h <<\EOF
#define USCORE 1 #define USCORE 1
EOF EOF
if test $ac_cv_func_dlopen = yes ; then
echo $ac_n "checking whether dlsym always adds an underscore for us""... $ac_c" 1>&6
if eval "test \"`echo '$''{'s48_cv_dlsym_adds_uscore'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
#line 1900 "configure"
#include "confdefs.h"
#include <dlfcn.h>
#include <stdio.h>
fnord() { int i=42;}
main() { void *self, *ptr1, *ptr2; self=dlopen(NULL,RTLD_LAZY);
if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
if(ptr1 && !ptr2) exit(0); } exit(1); }
EOF
{ (eval echo configure:1911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
if test -s conftest && (./conftest; exit) 2>/dev/null; then
s48_cv_dlsym_adds_uscore=yes
cat >> confdefs.h <<\EOF
#define DLSYM_ADDS_USCORE 1
EOF
else
s48_cv_dlsym_adds_uscore=no
fi
fi
rm -fr conftest*
fi
echo "$ac_t""$s48_cv_dlsym_adds_uscore" 1>&6
fi
fi fi
rm -f conftest.c a.out
echo $ac_n "checking for n_name""... $ac_c" 1>&6 echo $ac_n "checking for n_name""... $ac_c" 1>&6
@ -1894,7 +1933,7 @@ EOF
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1898 "configure" #line 1937 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <nlist.h> #include <nlist.h>
int main() { return 0; } int main() { return 0; }
@ -1903,7 +1942,7 @@ struct nlist name_list;
name_list.n_name = "foo"; name_list.n_name = "foo";
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1907: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:1946: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
s48_cv_nlist=yes s48_cv_nlist=yes
else else
@ -1929,7 +1968,7 @@ EOF
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1933 "configure" #line 1972 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <stdio.h> #include <stdio.h>
int main() { return 0; } int main() { return 0; }
@ -1937,7 +1976,7 @@ int t() {
return stdin->_cnt; return stdin->_cnt;
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1941: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:1980: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
s48_cv__cnt=yes s48_cv__cnt=yes
else else
@ -1964,7 +2003,7 @@ EOF
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1968 "configure" #line 2007 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <time.h> #include <time.h>
int main() { return 0; } int main() { return 0; }
@ -1972,7 +2011,7 @@ int t() {
return (int) tzname; return (int) tzname;
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1976: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:2015: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
scsh_cv_tzname=yes scsh_cv_tzname=yes
else else
@ -1998,7 +2037,7 @@ EOF
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2002 "configure" #line 2041 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <time.h> #include <time.h>
int main() { return 0; } int main() { return 0; }
@ -2007,7 +2046,7 @@ struct tm time;
return time.tm_gmtoff; return time.tm_gmtoff;
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2011: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:2050: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
scsh_cv_gmtoff=yes scsh_cv_gmtoff=yes
else else
@ -2033,7 +2072,7 @@ EOF
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2037 "configure" #line 2076 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
@ -2042,7 +2081,7 @@ int t() {
const extern char *sys_errlist[]; const extern char *sys_errlist[];
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2046: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:2085: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
scsh_cv_const_sys_errlist=yes scsh_cv_const_sys_errlist=yes
else else

View File

@ -85,10 +85,26 @@ AC_DEFUN(S48_USCORE, [
s48_cv_uscore=no s48_cv_uscore=no
fi]) fi])
AC_MSG_RESULT($s48_cv_uscore) AC_MSG_RESULT($s48_cv_uscore)
rm -f conftest.c a.out
if test $s48_cv_uscore = yes; then if test $s48_cv_uscore = yes; then
AC_DEFINE(USCORE) AC_DEFINE(USCORE)
if test $ac_cv_func_dlopen = yes ; then
AC_MSG_CHECKING(whether dlsym always adds an underscore for us)
AC_CACHE_VAL(s48_cv_dlsym_adds_uscore,AC_TRY_RUN( [
#include <dlfcn.h>
#include <stdio.h>
fnord() { int i=42;}
main() { void *self, *ptr1, *ptr2; self=dlopen(NULL,RTLD_LAZY);
if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
if(ptr1 && !ptr2) exit(0); } exit(1); }
], [s48_cv_dlsym_adds_uscore=yes
AC_DEFINE(DLSYM_ADDS_USCORE) ], s48_cv_dlsym_adds_uscore=no))
AC_MSG_RESULT($s48_cv_dlsym_adds_uscore)
fi
fi fi
rm -f conftest.c a.out
]) ])
dnl -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- dnl -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

View File

@ -5,7 +5,7 @@
#include "sysdep.h" #include "sysdep.h"
#include "scheme48.h" #include "scheme48.h"
/* /*
Hey folks, please help us out with conditions under which the Hey folks, please help us out with conditions under which the
ANCIENT_DYNLOAD and/or HAVE_DLOPEN code might work. About all we ANCIENT_DYNLOAD and/or HAVE_DLOPEN code might work. About all we
know is that ANCIENT_DYNLOAD worked once upon a time on the DEC know is that ANCIENT_DYNLOAD worked once upon a time on the DEC
@ -43,10 +43,10 @@ static char *shared_object_name(char *name)
{ {
char *res=0; char *res=0;
res = pathfind(getenv("LD_LIBRARY_PATH"), name, "r"); res = pathfind(getenv("LD_LIBRARY_PATH"), name, "r");
if (res) if (res)
return res; return res;
res = pathfind(getenv("S48_EXTERN_PATH"), name, "r"); res = pathfind(getenv("S48_EXTERN_PATH"), name, "r");
if (res) if (res)
return res; return res;
return name; return name;
} /* end of shared_object_name */ } /* end of shared_object_name */
@ -64,7 +64,7 @@ static char *shared_object_name(char *name)
/* SunoS5 & SVR4 define RTLD_NOW */ /* SunoS5 & SVR4 define RTLD_NOW */
#ifdef RTLD_NOW #ifdef RTLD_NOW
#define S48_DLOPEN_MODE RTLD_NOW #define S48_DLOPEN_MODE RTLD_NOW
#else #else
/* SunOS4 just says that mode should be 1 ie RTLD_LAZY */ /* SunOS4 just says that mode should be 1 ie RTLD_LAZY */
#define S48_DLOPEN_MODE 1 #define S48_DLOPEN_MODE 1
#endif /*RTLD_NOW*/ #endif /*RTLD_NOW*/
@ -112,7 +112,7 @@ dynamic_load(char*sharedobjname)
dlopened_handle[rank] = newhandle; dlopened_handle[rank] = newhandle;
#ifdef DLDEBUG #ifdef DLDEBUG
printf(" %s:%d %s sharedobjname='%s' pathname='%s' handle %#x rank=%d \n", printf(" %s:%d %s sharedobjname='%s' pathname='%s' handle %#x rank=%d \n",
__FILE__, __LINE__, __FUNCTION__, __FILE__, __LINE__, __FUNCTION__,
sharedobjname, pathname, newhandle, rank); sharedobjname, pathname, newhandle, rank);
#endif /*DLDEBUG*/ #endif /*DLDEBUG*/
return 0; return 0;
@ -125,6 +125,11 @@ lookup_dlsym(char *name, long *location)
void *adr; void *adr;
static void *selfhandle; static void *selfhandle;
int rank; int rank;
#if defined(USCORE) && defined(DLSYM_ADDS_USCORE)
name++;
#endif
/* perhaps i should scan the dlopened_handle from last to first, /* perhaps i should scan the dlopened_handle from last to first,
to find newest incarnation of symbol? in practice it should be faster to find newest incarnation of symbol? in practice it should be faster
to go from first (oldest) to last, to go from first (oldest) to last,
@ -135,20 +140,20 @@ lookup_dlsym(char *name, long *location)
*location = (long) adr; *location = (long) adr;
#ifdef DLDEBUG #ifdef DLDEBUG
printf(" %s:%d %s name='%s' in rank=%d at adr=%#x\n", printf(" %s:%d %s name='%s' in rank=%d at adr=%#x\n",
__FILE__, __LINE__, __FUNCTION__, __FILE__, __LINE__, __FUNCTION__,
name, rank, (long) adr); name, rank, (long) adr);
#endif /*DLDEBUG*/ #endif /*DLDEBUG*/
return 1; return 1;
}; };
/* find the name in the self process image - ie original scheme48 /* find the name in the self process image - ie original scheme48
executable file */ executable file */
if (!selfhandle) if (!selfhandle)
selfhandle=dlopen((char*)0, S48_DLOPEN_MODE); selfhandle=dlopen((char*)0, S48_DLOPEN_MODE);
if (adr=dlsym(selfhandle, name)) { if (adr=dlsym(selfhandle, name)) {
*location = (long) adr; *location = (long) adr;
#ifdef DLDEBUG #ifdef DLDEBUG
printf(" %s:%d %s name='%s' in self at adr=%#x\n", printf(" %s:%d %s name='%s' in self at adr=%#x\n",
__FILE__, __LINE__, __FUNCTION__, __FILE__, __LINE__, __FUNCTION__,
name, (long) adr); name, (long) adr);
#endif /*DLDEBUG*/ #endif /*DLDEBUG*/
return 1; return 1;
@ -156,7 +161,7 @@ lookup_dlsym(char *name, long *location)
/* can't find name so return 0 */ /* can't find name so return 0 */
#ifdef DLDEBUG #ifdef DLDEBUG
printf(" %s:%d %s name='%s' not found\n", printf(" %s:%d %s name='%s' not found\n",
__FILE__, __LINE__, __FUNCTION__, __FILE__, __LINE__, __FUNCTION__,
name); name);
#endif /*DLDEBUG*/ #endif /*DLDEBUG*/
return 0; return 0;
@ -194,7 +199,7 @@ struct exec { /* an exec-like structure for the MIPS */
#define TEXT_OFFSET(output_file_header) \ #define TEXT_OFFSET(output_file_header) \
(long) N_TXTOFF(output_file_header) (long) N_TXTOFF(output_file_header)
#endif #endif
extern char *object_file; /* specified via a command line argument */ extern char *object_file; /* specified via a command line argument */
@ -217,9 +222,9 @@ dynamic_load( char *user_args )
fprintf(stderr, "aborting dynamic load\n"); fprintf(stderr, "aborting dynamic load\n");
return(0); return(0);
} }
new_reloc_file = (char *) malloc(L_tmpnam); new_reloc_file = (char *) malloc(L_tmpnam);
tmpnam(new_reloc_file); tmpnam(new_reloc_file);
if (-1 == really_dynamic_load(old_reloc_file, new_reloc_file, if (-1 == really_dynamic_load(old_reloc_file, new_reloc_file,
@ -307,7 +312,7 @@ really_dynamic_load( char *reloc_info_file, char *output_file, char *user_args )
abort_load(command, NULL, NULL); abort_load(command, NULL, NULL);
return(-1); return(-1);
} }
/* move the storage pointer to the next page boundary */ /* move the storage pointer to the next page boundary */
end_of_memory = (long) sbrk(page_size - end_of_memory % page_size); end_of_memory = (long) sbrk(page_size - end_of_memory % page_size);
@ -318,7 +323,7 @@ really_dynamic_load( char *reloc_info_file, char *output_file, char *user_args )
} }
load_point = (long) sbrk(0); /* no malloc or printf after this */ load_point = (long) sbrk(0); /* no malloc or printf after this */
if (load_point < 0 || 0 != load_point % page_size) { if (load_point < 0 || 0 != load_point % page_size) {
fprintf(stderr, "couldn't align sbrk on page boundary\n"); fprintf(stderr, "couldn't align sbrk on page boundary\n");
abort_load(command, NULL, NULL); abort_load(command, NULL, NULL);
@ -399,7 +404,7 @@ really_dynamic_load( char *reloc_info_file, char *output_file, char *user_args )
abort_load(NULL, output_file_desc, output_file); abort_load(NULL, output_file_desc, output_file);
return(-1); return(-1);
} }
/* go to beginning of text */ /* go to beginning of text */
if (fseek(output_file_desc, TEXT_OFFSET(output_file_header), 0) if (fseek(output_file_desc, TEXT_OFFSET(output_file_header), 0)
< 0) { < 0) {
@ -467,7 +472,7 @@ s48_dynamic_load( long nargs, scheme_value *argv )
if (nargs != 1) return(SCHFALSE); if (nargs != 1) return(SCHFALSE);
arg = argv[0]; arg = argv[0];
if (!STRINGP(arg)) return(SCHFALSE); if (!STRINGP(arg)) return(SCHFALSE);
if (0 == dynamic_load(&STRING_REF(arg, 0))) if (0 == dynamic_load(&STRING_REF(arg, 0)))

View File

@ -120,6 +120,10 @@ struct sigaction {
/* Define USCORE if your c externals are prepended with an underscore */ /* Define USCORE if your c externals are prepended with an underscore */
#undef USCORE #undef USCORE
/* Define DLSYM_ADDS_USCORE if your system's dlsym() prepends an underscore
to symbol names. */
#undef DLSYM_ADDS_USCORE
/* Define if you have POSIX tzname (Losing sunos4...). */ /* Define if you have POSIX tzname (Losing sunos4...). */
#undef HAVE_TZNAME #undef HAVE_TZNAME