From: Petar Jovanovic Date: Tue, 2 Dec 2014 23:04:43 +0000 (+0000) Subject: mips: Do not use jal to reach __libc_start_main X-Git-Tag: glibc-2.21~289 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bbe4c142b024d639418069b480b0f3d05b489803;p=thirdparty%2Fglibc.git mips: Do not use jal to reach __libc_start_main 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. --- diff --git a/ChangeLog b/ChangeLog index a2c8b76b427..f8e0e6cb7d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-12-02 Petar Jovanovic + + [BZ #17601] + * sysdeps/mips/start.S (__start): Use indirect jump to call + __libc_start_main. + 2014-12-02 Joseph Myers * nptl/tst-stack4.c (dso_process): Use int not uintptr_t for t. diff --git a/NEWS b/NEWS index 1e2d2ae81d1..33ab071d3f9 100644 --- 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 diff --git a/sysdeps/mips/start.S b/sysdeps/mips/start.S index a454941e553..3c012f19875 100644 --- a/sysdeps/mips/start.S +++ b/sysdeps/mips/start.S @@ -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 */