Browse Source

ldso: mark _dl_exit as noreturn

Otherwise gcc might not understand that oom() ended control-flow and
might emit an (untaken) reference to abort() in _dl_update_slotinfo()
on e.g. SH4 which breaks linking ld-uClibc.so.
Arguably -ffreestanding should prevent GCC from emitting this
'.global abort' but alas, it does not, which is another bug..

Also mark the function cold to further lower the incoming frequency and
branch probability.

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Bernhard Reutner-Fischer 9 years ago
parent
commit
2c8a776668
1 changed files with 9 additions and 1 deletions
  1. 9 1
      ldso/include/dl-syscall.h

+ 9 - 1
ldso/include/dl-syscall.h

@@ -52,7 +52,15 @@ extern int _dl_errno;
    dynamic linking at all, so we cannot return any error codes.
    We just punt if there is an error. */
 #define __NR__dl_exit __NR_exit
-static __always_inline _syscall1(void, _dl_exit, int, status)
+static __always_inline attribute_noreturn __cold void _dl_exit(int status)
+{
+	INLINE_SYSCALL(_dl_exit, 1, status);
+#if defined __GNUC__
+	__builtin_unreachable(); /* shut up warning: 'noreturn' function does return*/
+#else
+	while (1);
+#endif
+}
 
 #define __NR__dl_close __NR_close
 static __always_inline _syscall1(int, _dl_close, int, fd)