aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-08-14 11:44:24 +0200
committerFlorian Weimer <fweimer@redhat.com>2017-08-14 15:08:48 +0200
commit9fa7449b35244645acaa450046b37678f46fe0f1 (patch)
tree83a87696a1e4ae4fad80f9167bb25e02c91dfe53
parent73322d5ff6ad71c65f875095c4801771cff9ab2d (diff)
downloadglibc-9fa7449b35244645acaa450046b37678f46fe0f1.zip
glibc-9fa7449b35244645acaa450046b37678f46fe0f1.tar.gz
glibc-9fa7449b35244645acaa450046b37678f46fe0f1.tar.bz2
_dl_fini: Remove internal_function attribute
Assembler code passes the address of _dl_fini to __libc_start_main, whose function pointer argument lacks the attribute. This means that calls could use the wrong ABI. Fortunately, for zero-parameter void-returning functions, internal_function does not change ABI on i386 (the only architecture which uses internal_function), so this inconsistency was harmless (which is why it had not been noticed so far).
-rw-r--r--ChangeLog5
-rw-r--r--elf/dl-fini.c1
-rw-r--r--sysdeps/generic/ldsodefs.h2
3 files changed, 6 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 7527943..bf655ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-08-14 Florian Weimer <fweimer@redhat.com>
+
+ * elf/dl-fini.c (_dl_fini): Remove internal_function
+ * sysdeps/generic/ldsodefs.h (_dl_fini): Likewise.
+
2017-08-14 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86/cpu-features.h (bit_cpu_BIT): New.
diff --git a/elf/dl-fini.c b/elf/dl-fini.c
index 93b337b..d6201b2 100644
--- a/elf/dl-fini.c
+++ b/elf/dl-fini.c
@@ -125,7 +125,6 @@ _dl_sort_fini (struct link_map **maps, size_t nmaps, char *used, Lmid_t ns)
void
-internal_function
_dl_fini (void)
{
/* Lots of fun ahead. We have to call the destructors for all still
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 3c92a29..4540096 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -968,7 +968,7 @@ extern void _dl_init (struct link_map *main_map, int argc, char **argv,
/* Call the finalizer functions of all shared objects whose
initializer functions have completed. */
-extern void _dl_fini (void) internal_function;
+extern void _dl_fini (void);
/* Sort array MAPS according to dependencies of the contained objects. */
extern void _dl_sort_fini (struct link_map **maps, size_t nmaps, char *used,