]> Zhao Yanbai Git Server - minix.git/commitdiff
Fine grained compatibility with _RENAMEd symbols
authorThomas Veerman <thomas@minix3.org>
Mon, 28 Nov 2011 10:12:44 +0000 (10:12 +0000)
committerThomas Veerman <thomas@minix3.org>
Mon, 28 Nov 2011 10:12:44 +0000 (10:12 +0000)
The NetBSD libc provides a mechanism to have versions of system calls.
By 'renaming' symbols to a new version, freshly compiled programs will
automatically use the new symbol iff they use the proper header files. The
old, not renamed, version of the symbol will still exist (after being moved
to the compat directory), so old programs can still link.

Since MINIX doesn't support dynamic linking, the whole rename mechanism
doesn't really work for us. However, removing it would create a huge diff
with the current NetBSD libc.

A lot of the compat code relies on things we don't (seem to) have, and
therefore does not get built and linked. This causes trouble for tools like
autoconf, which will fail to find the renamed symbols. For example,
currently select gets renamed to __select50 in libc. Autoconf looks for
'select' and doesn't find it and reports we don't have it. This is where
the compat.S stub comes into play: it generates the old symbols and jumps to
the new symbols. However, as this is done in one object file, all renamed
symbols get linked together, causing binaries to be huge. This patch fixes
that by generating an object file for each renamed symbol.

This patch also makes the MISSING_SYSCALLS more complete and marginally
reduces the diff with NetBSD.

lib/libutil/Makefile
lib/libutil/compat-minix/Makefile.inc [new file with mode: 0644]
lib/libutil/compat/Makefile.inc
lib/nbsd_libc/Makefile
lib/nbsd_libc/compat-minix/Makefile.inc [new file with mode: 0644]
lib/nbsd_libc/sys-minix/MISSING_SYSCALLS
lib/nbsd_libc/sys-minix/Makefile.inc
lib/nbsd_libc/sys-minix/compat.S [deleted file]
nbsd_include/time.h
nbsd_include/unistd.h

index 839af3a2b4172fc947415d917a79e6571d30bf8a..cb52a61582b2fc3c9ef0380c1391038d6551c459 100644 (file)
@@ -10,22 +10,17 @@ USE_SHLIBDIR=       yes
 WARNS= 4
 LIB=   util
 CPPFLAGS+=-DLIBC_SCCS -I${.CURDIR}
-SRCS=  efun.c getbootfile.c \
-       getmntopts.c \
-       login.c loginx.c login_tty.c logout.c logoutx.c \
-       logwtmp.c logwtmpx.c opendisk.c \
+.if !defined(__MINIX)
+SRCS+= efun.c getbootfile.c getlabelsector.c getmaxpartitions.c \
+       getmntopts.c getrawpartition.c \
+       disklabel_dkcksum.c disklabel_scan.c \
+       if_media.c \
+       login.c loginx.c login_cap.c login_tty.c logout.c logoutx.c \
+       logwtmp.c logwtmpx.c opendisk.c parsedate.y \
        passwd.c pw_scan.c pidfile.c pidlock.c pty.c \
        raise_default_signal.c \
-       secure_path.c snprintb.c \
-       ttyaction.c  login_cap.c stat_flags.c \
-       #disklabel_dkcksum.c disklabel_scan.c \
-       #if_media.c \
-       #sockaddr_snprintf.c
-       #getlabelsector.c
-       #getmaxpartitions.c
-       #getrawpartition.c
-       #ttymsg.c
-       #parsedate.y
+       secure_path.c sockaddr_snprintf.c stat_flags.c \
+       ttyaction.c ttymsg.c \
 
 MAN=   efun.3 getbootfile.3 getlabelsector.3 getmaxpartitions.3 \
        getmntopts.3 \
@@ -38,13 +33,39 @@ MAN=        efun.3 getbootfile.3 getlabelsector.3 getmaxpartitions.3 \
        snprintb.3 sockaddr_snprintf.3 stat_flags.3 ttyaction.3 \
        ttymsg.3 util.3
 
+.else
+SRCS+= efun.c getbootfile.c \
+       getmntopts.c \
+       login.c loginx.c login_cap.c login_tty.c logout.c logoutx.c \
+       logwtmp.c logwtmpx.c opendisk.c \
+       passwd.c pw_scan.c pidfile.c pidlock.c pty.c \
+       raise_default_signal.c \
+       secure_path.c stat_flags.c \
+       ttyaction.c \
+
+MAN=   efun.3 getbootfile.3 \
+       getmntopts.3 \
+       login.3 login_cap.3 loginx.3 \
+       opendisk.3 openpty.3 pidfile.3 pidlock.3 \
+       pw_getconf.3 pw_init.3 pw_lock.3 secure_path.3 \
+       raise_default_signal.3 \
+       snprintb.3 stat_flags.3 ttyaction.3 \
+       util.3
+.endif
+
 YPREFIX=__pd
 #.PATH:        ${NETBSDSRCDIR}/lib/libc/gen
 .PATH: ${NETBSDSRCDIR}/lib/nbsd_libc/gen
 
-#.include "compat/Makefile.inc"
+.if defined(__MINIX)
+.include "compat-minix/Makefile.inc"
+.else
+.include "compat/Makefile.inc"
+.endif
 
+.if !defined(__MINIX)
 MLINKS+=getlabelsector.3 getlabeloffset.3
+.endif
 MLINKS+=login.3 logout.3
 MLINKS+=login.3 logwtmp.3
 MLINKS+=login_cap.3 login_getclass.3
diff --git a/lib/libutil/compat-minix/Makefile.inc b/lib/libutil/compat-minix/Makefile.inc
new file mode 100644 (file)
index 0000000..278e0ad
--- /dev/null
@@ -0,0 +1,10 @@
+
+ASM=   compat__login_getpwclass50.S compat__login50.S compat__loginx50.S \
+       compat__pw_copy50.S compat__pw_copyx50.S \
+       compat__pw_getpwconf50.S compat__setusercontext50.S
+SRCS+= ${ASM}
+
+${ASM}:
+       ${_MKTARGET_CREATE}
+       printf '/* MINIX3 */\n\n/*\n * Compatibility jump table for renamed symbols.\n *\n * DO NOT EDIT: this file is automatically generated.\n */\n.global ${.PREFIX:S/^compat__//:C/([0-9]{2})$//};\n.global ${.PREFIX:S/^compat//};\n${.PREFIX:S/^compat__//:C/([0-9]{2})$//}: jmp ${.PREFIX:S/^compat//}\n' >${.TARGET}
+
index 982ebe3a4afe87112ffe2b5f83986309185f598a..9e0f550a15f1d83c923bc3edfb7c3f8d870bf5b0 100644 (file)
@@ -3,6 +3,5 @@
 .PATH: ${.CURDIR}/compat
 
 CPPFLAGS+=-I${.CURDIR}/../libc -I${.CURDIR}/../../sys
-SRCS+=compat_passwd.c compat_loginx.c compat_parsedate.c \
+SRCS+=compat_passwd.c compat_loginx.c compat_login.c compat_parsedate.c \
     compat_login_cap.c
-    #  compat_login.c
index 4b124caf862add75c45da4f549cbf2bfd239623a..32e67e7526c6807bca7957e4afd172b37343d293 100644 (file)
@@ -44,7 +44,6 @@ assym.h: ${ARCHDIR}/genassym.cf
        mv -f assym.h.tmp assym.h
 .endif
 
-.if !defined(__MINIX)
 # The following controls how to build compatibility code for old NetBSD
 # binaries. If BUILDCOLD is yes, then we build a separate library; otherwise
 # we include the code in libc.
@@ -53,11 +52,8 @@ BUILDCOLD?= no
 SUBDIR=compat
 .include <bsd.subdir.mk>
 .else
-COMPATDIR=${.CURDIR}/compat
-.include "${.CURDIR}/compat/Makefile.inc"
-.endif
-.else
-BUILDCOLD= no
+COMPATDIR= ${.CURDIR}/compat-minix
+.include "${.CURDIR}/compat-minix/Makefile.inc"
 .endif
 
 .include "${.CURDIR}/../../common/lib/libc/Makefile.inc"
diff --git a/lib/nbsd_libc/compat-minix/Makefile.inc b/lib/nbsd_libc/compat-minix/Makefile.inc
new file mode 100644 (file)
index 0000000..afc7ead
--- /dev/null
@@ -0,0 +1,38 @@
+
+ASM=   compat__opendir230.S compat__alphasort30.S compat__ctime50.S \
+       compat__ctime_r50.S compat__ctime_rz50.S compat__dbm_delete13.S \
+       compat__dbm_fetch13.S compat__dbm_firstkey13.S \
+       compat__dbm_nextkey13.S compat__dbm_store13.S compat__difftime50.S \
+       compat__fts_children60.S compat__fts_close60.S compat__fts_open60.S \
+       compat__fts_read60.S compat__fts_set60.S compat__getdents30.S \
+       compat__getitimer50.S compat__getlastlogx50.S compat__getpwent50.S \
+       compat__getpwent_r50.S compat__getpwnam50.S compat__getpwnam_r50.S \
+       compat__getpwuid50.S compat__getpwuid_r50.S compat__getutent50.S \
+       compat__getutmp50.S compat__getutmpx50.S compat__getutxent50.S \
+       compat__getutxid50.S compat__getutxline50.S compat__glob30.S \
+       compat__globfree30.S compat__gmtime50.S compat__gmtime_r50.S \
+       compat__localtime50.S compat__localtime_r50.S compat__localtime_rz50.S \
+       compat__longjmp14.S compat__mknod50.S compat__mktime50.S \
+       compat__mktime_z50.S compat__nanosleep50.S compat__offtime50.S \
+       compat__offtime_r50.S compat__opendir30.S compat__posix2time50.S \
+       compat__posix2time_z50.S compat__pututxline50.S \
+       compat__pwcache_userdb50.S compat__readdir30.S compat__readdir_r30.S \
+       compat___readdir_unlocked50.S compat__scandir30.S compat__select50.S \
+       compat__setitimer50.S compat__setjmp14.S compat__setlocale50.S \
+       compat__settimeofday50.S compat__shmctl50.S compat__sigaction14.S \
+       compat__sigaddset14.S compat__sigdelset14.S compat__sigemptyset14.S \
+       compat__sigfillset14.S compat__sigismember14.S compat__siglongjmp14.S \
+       compat__sigpending14.S compat__sigprocmask14.S compat__sigsetjmp14.S \
+       compat__sigsuspend14.S compat__time50.S compat__time2posix50.S \
+       compat__time2posix_z50.S compat__timegm50.S compat__timelocal50.S \
+       compat__timelocal_z50.S compat__timeoff50.S compat__tzalloc50.S \
+       compat__tzfree50.S compat__tzgetname50.S compat__tzset50.S \
+       compat__tzsetwall50.S compat__unsetenv13.S compat__unvis13.S \
+       compat__updlastlogx50.S compat__updwtmpx50.S compat__utime50.S \
+       compat__vfork14.S
+SRCS+= ${ASM}
+
+${ASM}:
+       ${_MKTARGET_CREATE}
+       printf '/* MINIX3 */\n\n/*\n * Compatibility jump table for renamed symbols.\n *\n * DO NOT EDIT: this file is automatically generated.\n */\n.global ${.PREFIX:S/^compat__//:C/([0-9]{2})$//};\n.global ${.PREFIX:S/^compat//};\n${.PREFIX:S/^compat__//:C/([0-9]{2})$//}: jmp ${.PREFIX:S/^compat//}\n' >${.TARGET}
+
index d6de9689c5f00f40d3346e39a41fcacac11da6d9..7093d1a2040523d483fd01f9862fe70c0c9b837d 100644 (file)
@@ -33,6 +33,8 @@ munlock
 munlockall
 modctl
 mprotect
+mq_timedreceive
+mq_timedsend
 mremap
 msgctl
 msgget
@@ -68,6 +70,7 @@ swapon
 sysarch
 timer_create
 timer_delete
+timer_gettime
 timer_settime
 undelete
 utimes
index 3442c938598fdbc717853168f0dcfb47b72d81b8..33bf63a5b9ea2b80c80ea6a226d8b51959d5fa9e 100644 (file)
@@ -1,6 +1,6 @@
 .PATH: ${.CURDIR}/sys-minix
 
-SRCS+=         accept.c access.c bind.c brk.c sbrk.c m_closefrom.c getsid.c compat.S \
+SRCS+=         accept.c access.c bind.c brk.c sbrk.c m_closefrom.c getsid.c \
        chdir.c chmod.c fchmod.c chown.c fchown.c chroot.c close.c \
        connect.c dup.c dup2.c execve.c fcntl.c flock.c fpathconf.c fork.c \
        fstatfs.c fstatvfs.c fsync.c ftruncate.c getdents.c getegid.c getgid.c \
diff --git a/lib/nbsd_libc/sys-minix/compat.S b/lib/nbsd_libc/sys-minix/compat.S
deleted file mode 100644 (file)
index 2c25cfb..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-
-#define MY_ALIAS(alias, orig)  \
-       .global alias;  \
-       .global orig;  \
-       alias: jmp orig
-
-MY_ALIAS(mknod, __mknod50)
-MY_ALIAS(ctime, __ctime50)
-MY_ALIAS(difftime, __difftime50)
-MY_ALIAS(gmtime, __gmtime50)
-MY_ALIAS(localtime, __locatime50)
-MY_ALIAS(time, __time50)
-MY_ALIAS(mktime, __mktime50)
-MY_ALIAS(tzset, __tzset50)
-MY_ALIAS(getitimer, __getitimer50)
-MY_ALIAS(setitimer, __setitimer50)
-MY_ALIAS(settimeofday, __settimeofday50)
-MY_ALIAS(nanosleep, __nanosleep50)
-MY_ALIAS(ctime_r, __ctime_r50)
-MY_ALIAS(gmtime_r, __gmtime_r50)
-MY_ALIAS(localtime_r, __localtime_r50)
-MY_ALIAS(time2posix, __time2posix50)
-MY_ALIAS(posix2time, __posix2time50)
-MY_ALIAS(timegm, __timegm50)
-MY_ALIAS(timeoff, __timeoff50)
-MY_ALIAS(timelocal, __timelocal50)
-MY_ALIAS(offtime, __offtime50)
-MY_ALIAS(tzsetwall, __tzsetwall50)
-MY_ALIAS(offtime_r, __offtime_r50)
-MY_ALIAS(localtime_rz, __localtime_rz50)
-MY_ALIAS(ctime_rz, __ctime_rz50)
-MY_ALIAS(mktime_z, __mktime_z50)
-MY_ALIAS(timelocal_z, __timelocal_z50)
-MY_ALIAS(time2posix_z, __time2posix_z50)
-MY_ALIAS(posix2time_z, __posix2time_z50)
-MY_ALIAS(tzalloc, __tzalloc50)
-MY_ALIAS(tzfree, __tzfree50)
-MY_ALIAS(tzgetname, __tzgetname50)
-MY_ALIAS(select, __select50)
-MY_ALIAS(opendir, __opendir30)
-MY_ALIAS(readdir, __readdir30)
-MY_ALIAS(readdir_r, __readdir_r30)
-MY_ALIAS(__opendir2, __opendir230)
-MY_ALIAS(scandir, __scandir30)
-MY_ALIAS(getdents, __getdents30)
-MY_ALIAS(alphasort, __alphasort30)
-MY_ALIAS(fts_children, __fts_children60)
-MY_ALIAS(fts_close, __fts_close60)
-MY_ALIAS(fts_open, __fts_open60)
-MY_ALIAS(fts_read, __fts_read60)
-MY_ALIAS(fts_set, __fts_set60)
-MY_ALIAS(glob, __glob30)
-MY_ALIAS(globfree, __globfree30)
-MY_ALIAS(dbm_delete, __dbm_delete13)
-MY_ALIAS(dbm_fetch, __dbm_fetch13)
-MY_ALIAS(dbm_firstkey, __dbm_firstkey13)
-MY_ALIAS(dbm_nextkey, __dbm_nextkey13)
-MY_ALIAS(dbm_store, __dbm_store13)
-MY_ALIAS(setjmp, __setjmp14)
-MY_ALIAS(longjmp, __longjmp14)
-MY_ALIAS(setlocale, __setlocale50)
-MY_ALIAS(shmctl, __shmctl50)
-MY_ALIAS(sigsetjmp, __sigsetjmp14)
-MY_ALIAS(siglongjmp, __siglongjmp14)
-MY_ALIAS(sigaction, __sigaction14)
-MY_ALIAS(sigaddset, __sigaddset14)
-MY_ALIAS(sigdelset, __sigdelset14)
-MY_ALIAS(sigemptyset, __sigemptyset14)
-MY_ALIAS(sigfillset, __sigfillset14)
-MY_ALIAS(sigismember, __sigismember14)
-MY_ALIAS(sigpending, __sigpending14)
-MY_ALIAS(sigprocmask, __sigprocmask14)
-MY_ALIAS(sigsuspend, __sigsuspend14)
-MY_ALIAS(unsetenv, __unsetenv13)
-MY_ALIAS(getutent, __getutent50)
-MY_ALIAS(getutxent, __getutxent50)
-MY_ALIAS(getutxid, __getutxid50)
-MY_ALIAS(getutxline, __getutxline50)
-MY_ALIAS(pututxline, __pututxline50)
-MY_ALIAS(updwtmpx, __updwtmpx50)
-MY_ALIAS(getlastlogx, __getlastlogx50)
-MY_ALIAS(updlastlogx, __updlastlogx50)
-MY_ALIAS(getutmp, __getutmp50)
-MY_ALIAS(getutmpx, __getutmpx50)
-MY_ALIAS(utime, __utime50)
-MY_ALIAS(unvis, __unvis13)
-MY_ALIAS(pwcache_userdb, __pwcache_userdb50)
-MY_ALIAS(getpwnam, __getpwnam50)
index 8dd65863acac2e76081997d6f6796c8b313f6fa9..7360bc629a8ad9d3a57b22e41ea18e019dea7858 100644 (file)
@@ -99,7 +99,11 @@ clock_t clock(void);
 char *ctime(const time_t *) __RENAME(__ctime50);
 double difftime(time_t, time_t) __RENAME(__difftime50);
 struct tm *gmtime(const time_t *) __RENAME(__gmtime50);
+#ifndef __MINIX
 struct tm *localtime(const time_t *) __RENAME(__locatime50);
+#else
+struct tm *localtime(const time_t *) __RENAME(__localtime50);
+#endif
 time_t time(time_t *) __RENAME(__time50);
 time_t mktime(struct tm *) __RENAME(__mktime50);
 #endif
index eef4fffd38ee7206935c22ba9f12335e667e7330..84bdadd73c7bc6f366b3b123d1f79dacbbabb345 100644 (file)
@@ -283,13 +283,9 @@ int         symlink(const char *, const char *);
 void    sync(void);
 useconds_t ualarm(useconds_t, useconds_t);
 int     usleep(useconds_t);
-#ifndef __minix
 #ifndef __LIBC12_SOURCE__
 pid_t   vfork(void) __RENAME(__vfork14);
 #endif
-#else
-pid_t   vfork(void);
-#endif /* !__minix */
 
 #ifndef __AUDIT__
 char   *getwd(char *);                         /* obsoleted by getcwd() */