From 4587a421c54a8912b3e24913c7e1501293042b40 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 1 Oct 2017 15:50:56 -0700 Subject: [PATCH] Mark internal dirent functions with attribute_hidden [BZ #18822] Mark internal dirent functions with attribute_hidden to allow direct access within libc.so and libc.a without using GOT nor PLT. __readdir64 is hidden with libc_hidden_proto and libc_hidden_def since the exported readdir64 is an alias of __readdir64. [BZ #18822] * include/dirent.h (__opendir): Always add attribute_hidden. (__fdopendir): Likewise. (__closedir): Likewise. (__readdir): Likewise. (__readdir64): Add libc_hidden_proto. * sysdeps/mach/hurd/readdir64.c (__readdir64): Add libc_hidden_def. * sysdeps/unix/sysv/linux/i386/readdir64.c (__readdir64): Likewise. * sysdeps/unix/sysv/linux/readdir64.c (__readdir64): Likewise. * sysdeps/unix/sysv/linux/wordsize-64/readdir.c (__GI___readdir64): New alias. --- ChangeLog | 14 ++++++++++++++ include/dirent.h | 13 +++++-------- sysdeps/mach/hurd/readdir64.c | 1 + sysdeps/unix/sysv/linux/i386/readdir64.c | 1 + sysdeps/unix/sysv/linux/readdir64.c | 1 + sysdeps/unix/sysv/linux/wordsize-64/readdir.c | 1 + 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 98d572b8da..628b11452f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2017-10-01 H.J. Lu + + [BZ #18822] + * include/dirent.h (__opendir): Always add attribute_hidden. + (__fdopendir): Likewise. + (__closedir): Likewise. + (__readdir): Likewise. + (__readdir64): Add libc_hidden_proto. + * sysdeps/mach/hurd/readdir64.c (__readdir64): Add libc_hidden_def. + * sysdeps/unix/sysv/linux/i386/readdir64.c (__readdir64): Likewise. + * sysdeps/unix/sysv/linux/readdir64.c (__readdir64): Likewise. + * sysdeps/unix/sysv/linux/wordsize-64/readdir.c (__GI___readdir64): + New alias. + 2017-10-01 H.J. Lu [BZ #18822] diff --git a/include/dirent.h b/include/dirent.h index d7dbf83964..6fcc2f391b 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -15,12 +15,13 @@ struct scandir_cancel_struct }; /* Now define the internal interfaces. */ -extern DIR *__opendir (const char *__name); +extern DIR *__opendir (const char *__name) attribute_hidden; extern DIR *__opendirat (int dfd, const char *__name) attribute_hidden; -extern DIR *__fdopendir (int __fd); -extern int __closedir (DIR *__dirp); -extern struct dirent *__readdir (DIR *__dirp); +extern DIR *__fdopendir (int __fd) attribute_hidden; +extern int __closedir (DIR *__dirp) attribute_hidden; +extern struct dirent *__readdir (DIR *__dirp) attribute_hidden; extern struct dirent64 *__readdir64 (DIR *__dirp); +libc_hidden_proto (__readdir64) extern int __readdir_r (DIR *__dirp, struct dirent *__entry, struct dirent **__result); extern int __readdir64_r (DIR *__dirp, struct dirent64 *__entry, @@ -77,10 +78,6 @@ libc_hidden_proto (__scandirat) libc_hidden_proto (scandirat64) # if IS_IN (rtld) -extern __typeof (__closedir) __closedir attribute_hidden; -extern __typeof (__fdopendir) __fdopendir attribute_hidden; -extern __typeof (__readdir) __readdir attribute_hidden; -extern __typeof (__readdir64) __readdir64 attribute_hidden; extern __typeof (__rewinddir) __rewinddir attribute_hidden; # endif # endif diff --git a/sysdeps/mach/hurd/readdir64.c b/sysdeps/mach/hurd/readdir64.c index f422fcff04..bad0bcb559 100644 --- a/sysdeps/mach/hurd/readdir64.c +++ b/sysdeps/mach/hurd/readdir64.c @@ -98,4 +98,5 @@ __readdir64 (DIR *dirp) return dp; } +libc_hidden_def (__readdir64) weak_alias (__readdir64, readdir64) diff --git a/sysdeps/unix/sysv/linux/i386/readdir64.c b/sysdeps/unix/sysv/linux/i386/readdir64.c index da3defd379..013bb252f4 100644 --- a/sysdeps/unix/sysv/linux/i386/readdir64.c +++ b/sysdeps/unix/sysv/linux/i386/readdir64.c @@ -27,6 +27,7 @@ #undef __GETDENTS #undef DIRENT_TYPE +libc_hidden_def (__readdir64) versioned_symbol (libc, __readdir64, readdir64, GLIBC_2_2); #if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2) diff --git a/sysdeps/unix/sysv/linux/readdir64.c b/sysdeps/unix/sysv/linux/readdir64.c index 224f53db88..6d154fe988 100644 --- a/sysdeps/unix/sysv/linux/readdir64.c +++ b/sysdeps/unix/sysv/linux/readdir64.c @@ -4,4 +4,5 @@ #include +libc_hidden_def (__readdir64) weak_alias (__readdir64, readdir64) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir.c index e197d93b00..0d5798849d 100644 --- a/sysdeps/unix/sysv/linux/wordsize-64/readdir.c +++ b/sysdeps/unix/sysv/linux/wordsize-64/readdir.c @@ -3,5 +3,6 @@ #include #undef __readdir64 strong_alias (__readdir, __readdir64) +strong_alias (__readdir, __GI___readdir64) #undef readdir64 weak_alias (__readdir, readdir64)