mips: Do not use jal to reach __libc_start_main
authorPetar Jovanovic <petar.jovanovic@rt-rk.com>
Tue, 2 Dec 2014 23:04:43 +0000 (23:04 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 2 Dec 2014 23:04:43 +0000 (23:04 +0000)
Since __libc_start_main may not be in the same 256MB-aligned region as
the function __start, replace use of jal instruction with la/jalr.

This fixes linker issue reported in:
https://sourceware.org/bugzilla/show_bug.cgi?id=17601

[BZ #17601]
* sysdeps/mips/start.S (__start): Use indirect jump to call
__libc_start_main.

ChangeLog
NEWS
sysdeps/mips/start.S

index a2c8b76..f8e0e6c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-02  Petar Jovanovic  <petar.jovanovic@rt-rk.com>
+
+       [BZ #17601]
+       * sysdeps/mips/start.S (__start): Use indirect jump to call
+       __libc_start_main.
+
 2014-12-02  Joseph Myers  <joseph@codesourcery.com>
 
        * nptl/tst-stack4.c (dso_process): Use int not uintptr_t for t.
diff --git a/NEWS b/NEWS
index 1e2d2ae..33ab071 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,7 +13,7 @@ Version 2.21
   16619, 16740, 16857, 17192, 17266, 17344, 17363, 17370, 17371, 17411,
   17460, 17475, 17485, 17501, 17506, 17508, 17522, 17555, 17570, 17571,
   17572, 17573, 17574, 17581, 17582, 17583, 17584, 17585, 17589, 17594,
-  17608, 17616, 17625, 17633, 17664, 17665.
+  17601, 17608, 17616, 17625, 17633, 17664, 17665.
 
 * CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag
   under certain input conditions resulting in the execution of a shell for
index a454941..3c012f1 100644 (file)
@@ -106,7 +106,8 @@ ENTRY_POINT:
        move $9, $2             /* rtld_fini */
        move $10, $29           /* stack_end */
 # endif
-       jal __libc_start_main
+       PTR_LA $25, __libc_start_main
+       jalr   $25
 hlt:   b hlt                   /* Crash if somehow it does return.  */
 
 #elif _MIPS_SIM == _ABIO32 /* __mips16 */
@@ -157,7 +158,9 @@ ENTRY_POINT:
        sw      $4, 16($sp)                     /* fini */
        lw      $4, 3f                          /* main */
        sw      $2, 20($sp)                     /* rtld_fini */
-       jal     __libc_start_main
+       /* Load and call __libc_start_main().  */
+       lw      $3, 4f
+       jalr    $3
 # endif
 hlt:   b       hlt             /* Crash if somehow it does return.  */
 # ifndef __PIC__
@@ -165,6 +168,7 @@ hlt:        b       hlt             /* Crash if somehow it does return.  */
 1:     .word   __libc_csu_fini
 2:     .word   __libc_csu_init
 3:     .word   main
+4:     .word   __libc_start_main
 # endif
 
 #else /* __mips16 && _MIPS_SIM != _ABIO32 */