Fine grained compatibility with _RENAMEd symbols

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.
This commit is contained in:
Thomas Veerman 2011-11-28 10:12:44 +00:00
parent 92b61c816d
commit fb50da9dad
10 changed files with 95 additions and 116 deletions

View 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

View file

@ -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}

View 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

View 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"

View file

@ -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}

View 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

View 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 \

View file

@ -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)

View 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

View 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() */