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 WARNS= 4
LIB= util LIB= util
CPPFLAGS+=-DLIBC_SCCS -I${.CURDIR} CPPFLAGS+=-DLIBC_SCCS -I${.CURDIR}
SRCS= efun.c getbootfile.c \ .if !defined(__MINIX)
getmntopts.c \ SRCS+= efun.c getbootfile.c getlabelsector.c getmaxpartitions.c \
login.c loginx.c login_tty.c logout.c logoutx.c \ getmntopts.c getrawpartition.c \
logwtmp.c logwtmpx.c opendisk.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 \ passwd.c pw_scan.c pidfile.c pidlock.c pty.c \
raise_default_signal.c \ raise_default_signal.c \
secure_path.c snprintb.c \ secure_path.c sockaddr_snprintf.c stat_flags.c \
ttyaction.c login_cap.c stat_flags.c \ ttyaction.c ttymsg.c \
#disklabel_dkcksum.c disklabel_scan.c \
#if_media.c \
#sockaddr_snprintf.c
#getlabelsector.c
#getmaxpartitions.c
#getrawpartition.c
#ttymsg.c
#parsedate.y
MAN= efun.3 getbootfile.3 getlabelsector.3 getmaxpartitions.3 \ MAN= efun.3 getbootfile.3 getlabelsector.3 getmaxpartitions.3 \
getmntopts.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 \ snprintb.3 sockaddr_snprintf.3 stat_flags.3 ttyaction.3 \
ttymsg.3 util.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 YPREFIX=__pd
#.PATH: ${NETBSDSRCDIR}/lib/libc/gen #.PATH: ${NETBSDSRCDIR}/lib/libc/gen
.PATH: ${NETBSDSRCDIR}/lib/nbsd_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 MLINKS+=getlabelsector.3 getlabeloffset.3
.endif
MLINKS+=login.3 logout.3 MLINKS+=login.3 logout.3
MLINKS+=login.3 logwtmp.3 MLINKS+=login.3 logwtmp.3
MLINKS+=login_cap.3 login_getclass.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 .PATH: ${.CURDIR}/compat
CPPFLAGS+=-I${.CURDIR}/../libc -I${.CURDIR}/../../sys 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_cap.c
# compat_login.c

View file

@ -44,7 +44,6 @@ assym.h: ${ARCHDIR}/genassym.cf
mv -f assym.h.tmp assym.h mv -f assym.h.tmp assym.h
.endif .endif
.if !defined(__MINIX)
# The following controls how to build compatibility code for old NetBSD # The following controls how to build compatibility code for old NetBSD
# binaries. If BUILDCOLD is yes, then we build a separate library; otherwise # binaries. If BUILDCOLD is yes, then we build a separate library; otherwise
# we include the code in libc. # we include the code in libc.
@ -53,11 +52,8 @@ BUILDCOLD?= no
SUBDIR=compat SUBDIR=compat
.include <bsd.subdir.mk> .include <bsd.subdir.mk>
.else .else
COMPATDIR=${.CURDIR}/compat COMPATDIR= ${.CURDIR}/compat-minix
.include "${.CURDIR}/compat/Makefile.inc" .include "${.CURDIR}/compat-minix/Makefile.inc"
.endif
.else
BUILDCOLD= no
.endif .endif
.include "${.CURDIR}/../../common/lib/libc/Makefile.inc" .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 munlockall
modctl modctl
mprotect mprotect
mq_timedreceive
mq_timedsend
mremap mremap
msgctl msgctl
msgget msgget
@ -68,6 +70,7 @@ swapon
sysarch sysarch
timer_create timer_create
timer_delete timer_delete
timer_gettime
timer_settime timer_settime
undelete undelete
utimes utimes

View file

@ -1,6 +1,6 @@
.PATH: ${.CURDIR}/sys-minix .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 \ 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 \ 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 \ 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); char *ctime(const time_t *) __RENAME(__ctime50);
double difftime(time_t, time_t) __RENAME(__difftime50); double difftime(time_t, time_t) __RENAME(__difftime50);
struct tm *gmtime(const time_t *) __RENAME(__gmtime50); struct tm *gmtime(const time_t *) __RENAME(__gmtime50);
#ifndef __MINIX
struct tm *localtime(const time_t *) __RENAME(__locatime50); 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 time(time_t *) __RENAME(__time50);
time_t mktime(struct tm *) __RENAME(__mktime50); time_t mktime(struct tm *) __RENAME(__mktime50);
#endif #endif

View file

@ -283,13 +283,9 @@ int symlink(const char *, const char *);
void sync(void); void sync(void);
useconds_t ualarm(useconds_t, useconds_t); useconds_t ualarm(useconds_t, useconds_t);
int usleep(useconds_t); int usleep(useconds_t);
#ifndef __minix
#ifndef __LIBC12_SOURCE__ #ifndef __LIBC12_SOURCE__
pid_t vfork(void) __RENAME(__vfork14); pid_t vfork(void) __RENAME(__vfork14);
#endif #endif
#else
pid_t vfork(void);
#endif /* !__minix */
#ifndef __AUDIT__ #ifndef __AUDIT__
char *getwd(char *); /* obsoleted by getcwd() */ char *getwd(char *); /* obsoleted by getcwd() */