about summary refs log tree commit diff
path: root/arch
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-12-29 13:01:29 -0500
committerRich Felker <dalias@aerifal.cx>2015-12-29 13:01:29 -0500
commit5e396fb996a80b035d0f6ecf7fed50f68aa3ebb7 (patch)
treef4a406574f07a5a4d16ce384bcf100789100dba2 /arch
parent71991a803c8a8fe10a6ed49bc4f0a1f4890d6c46 (diff)
downloadmusl-5e396fb996a80b035d0f6ecf7fed50f68aa3ebb7.tar.gz
musl-5e396fb996a80b035d0f6ecf7fed50f68aa3ebb7.tar.xz
musl-5e396fb996a80b035d0f6ecf7fed50f68aa3ebb7.zip
adjust mips crt_arch entry point asm to avoid assembler bugs
apparently the .gpword directive does not work reliably with local
text labels; values produced were offset by 64k from the correct
value, resulting in incorrect computation of the got pointer at
runtime. instead, use an external label so that the assembler does not
munge the relocation; the linker will then get it right.

commit 6fef8cafbd0f6f185897bc87feb1ff66e2e204e1 exposed this issue by
removing the old, non-PIE-compatible handwritten crt1.s, which was not
affected. presumably mips PIE executables (using Scrt1.o produced from
crt_arch.h) were already affected at the time.
Diffstat (limited to 'arch')
-rw-r--r--arch/mips/crt_arch.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/mips/crt_arch.h b/arch/mips/crt_arch.h
index 21e139b9..f4ba02ae 100644
--- a/arch/mips/crt_arch.h
+++ b/arch/mips/crt_arch.h
@@ -4,13 +4,16 @@ __asm__(
 ".text \n"
 ".global _" START "\n"
 ".global " START "\n"
+".global " START "_data\n"
 ".type   _" START ", @function\n"
 ".type   " START ", @function\n"
+".type   " START "_data, @function\n"
 "_" START ":\n"
 "" START ":\n"
 "	bal 1f \n"
 "	 move $fp, $0 \n"
-"2:	.gpword 2b \n"
+"" START "_data: \n"
+"	.gpword " START "_data \n"
 "	.gpword " START "_c \n"
 ".weak _DYNAMIC \n"
 ".hidden _DYNAMIC \n"