Merge "ARM: make sure __on_dlclose() actually gets called"
diff --git a/libc/Android.mk b/libc/Android.mk
index 8085ac5..04301ef 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -362,7 +362,6 @@
# =========================================================
ifeq ($(TARGET_ARCH),arm)
libc_common_src_files += \
- arch-arm/bionic/__get_pc.S \
arch-arm/bionic/__get_sp.S \
arch-arm/bionic/_exit_with_stack_teardown.S \
arch-arm/bionic/_setjmp.S \
diff --git a/libc/arch-arm/bionic/__get_pc.S b/libc/arch-arm/bionic/__get_pc.S
deleted file mode 100644
index 4fc8929..0000000
--- a/libc/arch-arm/bionic/__get_pc.S
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-.global __get_pc
-.type __get_pc, %function
-
-__get_pc:
- mov r0, pc
- bx lr
-
diff --git a/libc/arch-arm/bionic/crtbegin.c b/libc/arch-arm/bionic/crtbegin.c
index 9dcd254..0e2d31e 100644
--- a/libc/arch-arm/bionic/crtbegin.c
+++ b/libc/arch-arm/bionic/crtbegin.c
@@ -31,7 +31,6 @@
void (**preinit_array)(void);
void (**init_array)(void);
void (**fini_array)(void);
- void (**ctors_array)(void);
} structors_array_t;
extern int main(int argc, char **argv, char **env);
@@ -52,10 +51,7 @@
__attribute__ ((section (".fini_array")))
void (*__FINI_ARRAY__)(void) = (void (*)(void)) -1;
-__attribute__ ((section (".ctors")))
-void (*__CTOR_LIST__)(void) = (void (*)(void)) -1;
-
-__attribute__((visbility("hidden")))
+__attribute__((visibility("hidden")))
void _start() {
structors_array_t array;
void *elfdata;
@@ -63,7 +59,6 @@
array.preinit_array = &__PREINIT_ARRAY__;
array.init_array = &__INIT_ARRAY__;
array.fini_array = &__FINI_ARRAY__;
- array.ctors_array = &__CTOR_LIST__;
elfdata = __builtin_frame_address(0) + sizeof(void *);
__libc_init(elfdata, (void *) 0, &main, &array);
diff --git a/libc/arch-arm/bionic/crtend.S b/libc/arch-arm/bionic/crtend.S
index 7196fc1..fffb0ab 100644
--- a/libc/arch-arm/bionic/crtend.S
+++ b/libc/arch-arm/bionic/crtend.S
@@ -35,9 +35,6 @@
.section .fini_array, "aw"
.long 0
- .section .ctors, "aw"
- .long 0
-
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif
diff --git a/libc/arch-arm/bionic/crtend_so.S b/libc/arch-arm/bionic/crtend_so.S
index 0cb9947..bb6570e 100644
--- a/libc/arch-arm/bionic/crtend_so.S
+++ b/libc/arch-arm/bionic/crtend_so.S
@@ -26,16 +26,6 @@
* SUCH DAMAGE.
*/
-/* This is the same than crtend.S except that a shared library
- * cannot have a .preinit_array
- */
-
- .section .init_array, "aw"
- .long 0
-
- .section .fini_array, "aw"
- .long 0
-
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif
diff --git a/libc/arch-mips/bionic/crtbegin.S b/libc/arch-mips/bionic/crtbegin.S
index d85d52c..40b689e 100644
--- a/libc/arch-mips/bionic/crtbegin.S
+++ b/libc/arch-mips/bionic/crtbegin.S
@@ -70,8 +70,6 @@
1: .long __PREINIT_ARRAY__
.long __INIT_ARRAY__
.long __FINI_ARRAY__
- .long __CTOR_LIST__
- .long __DTOR_LIST__
.section .preinit_array, "aw"
.type __PREINIT_ARRAY__, @object
@@ -92,18 +90,6 @@
.long -1
.long __do_global_dtors_aux
- .section .ctors, "aw"
- .type __CTOR_LIST__, @object
- .globl __CTOR_LIST__
-__CTOR_LIST__:
- .long -1
-
- .section .dtors, "aw"
- .type __DTOR_LIST__, @object
- .globl __DTOR_LIST__
-__DTOR_LIST__:
- .long -1
-
.abicalls
.text
.align 2
diff --git a/libc/arch-mips/bionic/crtend.S b/libc/arch-mips/bionic/crtend.S
index 7a319be..6984d0e 100644
--- a/libc/arch-mips/bionic/crtend.S
+++ b/libc/arch-mips/bionic/crtend.S
@@ -35,13 +35,3 @@
.section .fini_array, "aw"
.long 0
- .section .ctors, "aw"
- .type __CTOR_END__, @object
-__CTOR_END__:
- .long 0
-
- .section .dtors, "aw"
- .type __DTOR_END__, @object
-__DTOR_END__:
- .long 0
-
diff --git a/libc/arch-x86/string/ssse3-strcmp-latest.S b/libc/arch-x86/string/ssse3-strcmp-latest.S
index 69c6425..673ba57 100644
--- a/libc/arch-x86/string/ssse3-strcmp-latest.S
+++ b/libc/arch-x86/string/ssse3-strcmp-latest.S
@@ -102,7 +102,7 @@
/* calculate left number to compare */ \
mov $16, %esi; \
sub %ecx, %esi; \
- cmp %esi, %ebp; \
+ cmpl %esi, %ebp; \
jbe L(more8byteseq); \
sub %esi, %ebp
#endif
@@ -116,7 +116,7 @@
movl STR2(%esp), %eax
#ifdef USE_AS_STRNCMP
movl CNT(%esp), %ebp
- cmp $16, %ebp
+ cmpl $16, %ebp
jb L(less16bytes_sncmp)
jmp L(more16bytes)
#endif
@@ -172,18 +172,18 @@
add $8, %edx
add $8, %eax
#ifdef USE_AS_STRNCMP
- cmp $8, %ebp
+ cmpl $8, %ebp
lea -8(%ebp), %ebp
je L(eq)
L(more16bytes):
#endif
movl %edx, %ecx
and $0xfff, %ecx
- cmp $0xff0, %ecx
+ cmpl $0xff0, %ecx
ja L(crosspage)
mov %eax, %ecx
and $0xfff, %ecx
- cmp $0xff0, %ecx
+ cmpl $0xff0, %ecx
ja L(crosspage)
pxor %xmm0, %xmm0
movlpd (%eax), %xmm1
@@ -197,7 +197,7 @@
sub $0xffff, %ecx
jnz L(less16bytes)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(eq)
#endif
@@ -220,7 +220,7 @@
xor %ecx, %eax
xor %edi, %edx
xor %ebx, %ebx
- cmp %edi, %ecx
+ cmpl %edi, %ecx
je L(ashr_0)
ja L(bigger)
or $0x20, %ebx
@@ -229,37 +229,37 @@
L(bigger):
lea 15(%edi), %edi
sub %ecx, %edi
- cmp $8, %edi
+ cmpl $8, %edi
jle L(ashr_less_8)
- cmp $14, %edi
+ cmpl $14, %edi
je L(ashr_15)
- cmp $13, %edi
+ cmpl $13, %edi
je L(ashr_14)
- cmp $12, %edi
+ cmpl $12, %edi
je L(ashr_13)
- cmp $11, %edi
+ cmpl $11, %edi
je L(ashr_12)
- cmp $10, %edi
+ cmpl $10, %edi
je L(ashr_11)
- cmp $9, %edi
+ cmpl $9, %edi
je L(ashr_10)
L(ashr_less_8):
je L(ashr_9)
- cmp $7, %edi
+ cmpl $7, %edi
je L(ashr_8)
- cmp $6, %edi
+ cmpl $6, %edi
je L(ashr_7)
- cmp $5, %edi
+ cmpl $5, %edi
je L(ashr_6)
- cmp $4, %edi
+ cmpl $4, %edi
je L(ashr_5)
- cmp $3, %edi
+ cmpl $3, %edi
je L(ashr_4)
- cmp $2, %edi
+ cmpl $2, %edi
je L(ashr_3)
- cmp $1, %edi
+ cmpl $1, %edi
je L(ashr_2)
- cmp $0, %edi
+ cmpl $0, %edi
je L(ashr_1)
/*
@@ -297,7 +297,7 @@
sub $0xffff, %esi
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -355,7 +355,7 @@
sub $0xffff, %esi
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -380,7 +380,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -396,7 +396,7 @@
jnz L(ashr_1_exittail)
#ifdef USE_AS_STRNCMP
- cmp $15, %ebp
+ cmpl $15, %ebp
jbe L(ashr_1_exittail)
#endif
pxor %xmm0, %xmm0
@@ -462,7 +462,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -486,7 +486,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -502,7 +502,7 @@
jnz L(ashr_2_exittail)
#ifdef USE_AS_STRNCMP
- cmp $14, %ebp
+ cmpl $14, %ebp
jbe L(ashr_2_exittail)
#endif
@@ -569,7 +569,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -593,7 +593,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -609,7 +609,7 @@
jnz L(ashr_3_exittail)
#ifdef USE_AS_STRNCMP
- cmp $13, %ebp
+ cmpl $13, %ebp
jbe L(ashr_3_exittail)
#endif
pxor %xmm0, %xmm0
@@ -675,7 +675,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -700,7 +700,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -717,7 +717,7 @@
jnz L(ashr_4_exittail)
#ifdef USE_AS_STRNCMP
- cmp $12, %ebp
+ cmpl $12, %ebp
jbe L(ashr_4_exittail)
#endif
@@ -784,7 +784,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -808,7 +808,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -824,7 +824,7 @@
jnz L(ashr_5_exittail)
#ifdef USE_AS_STRNCMP
- cmp $11, %ebp
+ cmpl $11, %ebp
jbe L(ashr_5_exittail)
#endif
pxor %xmm0, %xmm0
@@ -891,7 +891,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -915,7 +915,7 @@
sub $0xffff, %esi
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -932,7 +932,7 @@
jnz L(ashr_6_exittail)
#ifdef USE_AS_STRNCMP
- cmp $10, %ebp
+ cmpl $10, %ebp
jbe L(ashr_6_exittail)
#endif
pxor %xmm0, %xmm0
@@ -999,7 +999,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1024,7 +1024,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1041,7 +1041,7 @@
jnz L(ashr_7_exittail)
#ifdef USE_AS_STRNCMP
- cmp $9, %ebp
+ cmpl $9, %ebp
jbe L(ashr_7_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1108,7 +1108,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1132,7 +1132,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1148,7 +1148,7 @@
jnz L(ashr_8_exittail)
#ifdef USE_AS_STRNCMP
- cmp $8, %ebp
+ cmpl $8, %ebp
jbe L(ashr_8_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1215,7 +1215,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1239,7 +1239,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1255,7 +1255,7 @@
jnz L(ashr_9_exittail)
#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+ cmpl $7, %ebp
jbe L(ashr_9_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1321,7 +1321,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1345,7 +1345,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1361,7 +1361,7 @@
jnz L(ashr_10_exittail)
#ifdef USE_AS_STRNCMP
- cmp $6, %ebp
+ cmpl $6, %ebp
jbe L(ashr_10_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1427,7 +1427,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1451,7 +1451,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1467,7 +1467,7 @@
jnz L(ashr_11_exittail)
#ifdef USE_AS_STRNCMP
- cmp $5, %ebp
+ cmpl $5, %ebp
jbe L(ashr_11_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1533,7 +1533,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1558,7 +1558,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1574,7 +1574,7 @@
jnz L(ashr_12_exittail)
#ifdef USE_AS_STRNCMP
- cmp $4, %ebp
+ cmpl $4, %ebp
jbe L(ashr_12_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1640,7 +1640,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1664,7 +1664,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1680,7 +1680,7 @@
jnz L(ashr_13_exittail)
#ifdef USE_AS_STRNCMP
- cmp $3, %ebp
+ cmpl $3, %ebp
jbe L(ashr_13_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1746,7 +1746,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1770,7 +1770,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1786,7 +1786,7 @@
jnz L(ashr_14_exittail)
#ifdef USE_AS_STRNCMP
- cmp $2, %ebp
+ cmpl $2, %ebp
jbe L(ashr_14_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1853,7 +1853,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1877,7 +1877,7 @@
jnz L(exit)
#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
+ cmpl $16, %ebp
lea -16(%ebp), %ebp
jbe L(more8byteseq)
#endif
@@ -1893,7 +1893,7 @@
jnz L(ashr_15_exittail)
#ifdef USE_AS_STRNCMP
- cmp $1, %ebp
+ cmpl $1, %ebp
jbe L(ashr_15_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1955,12 +1955,12 @@
test $0x40, %cl
jnz L(Byte6)
#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+ cmpl $7, %ebp
jbe L(eq)
#endif
- movzx 7(%eax), %ecx
- movzx 7(%edx), %eax
+ movzbl 7(%eax), %ecx
+ movzbl 7(%edx), %eax
sub %ecx, %eax
RETURN
@@ -1968,11 +1968,11 @@
.p2align 4
L(Byte0):
#ifdef USE_AS_STRNCMP
- cmp $0, %ebp
+ cmpl $0, %ebp
jbe L(eq)
#endif
- movzx (%eax), %ecx
- movzx (%edx), %eax
+ movzbl (%eax), %ecx
+ movzbl (%edx), %eax
sub %ecx, %eax
RETURN
@@ -1980,11 +1980,11 @@
.p2align 4
L(Byte1):
#ifdef USE_AS_STRNCMP
- cmp $1, %ebp
+ cmpl $1, %ebp
jbe L(eq)
#endif
- movzx 1(%eax), %ecx
- movzx 1(%edx), %eax
+ movzbl 1(%eax), %ecx
+ movzbl 1(%edx), %eax
sub %ecx, %eax
RETURN
@@ -1992,11 +1992,11 @@
.p2align 4
L(Byte2):
#ifdef USE_AS_STRNCMP
- cmp $2, %ebp
+ cmpl $2, %ebp
jbe L(eq)
#endif
- movzx 2(%eax), %ecx
- movzx 2(%edx), %eax
+ movzbl 2(%eax), %ecx
+ movzbl 2(%edx), %eax
sub %ecx, %eax
RETURN
@@ -2004,11 +2004,11 @@
.p2align 4
L(Byte3):
#ifdef USE_AS_STRNCMP
- cmp $3, %ebp
+ cmpl $3, %ebp
jbe L(eq)
#endif
- movzx 3(%eax), %ecx
- movzx 3(%edx), %eax
+ movzbl 3(%eax), %ecx
+ movzbl 3(%edx), %eax
sub %ecx, %eax
RETURN
@@ -2016,11 +2016,11 @@
.p2align 4
L(Byte4):
#ifdef USE_AS_STRNCMP
- cmp $4, %ebp
+ cmpl $4, %ebp
jbe L(eq)
#endif
- movzx 4(%eax), %ecx
- movzx 4(%edx), %eax
+ movzbl 4(%eax), %ecx
+ movzbl 4(%edx), %eax
sub %ecx, %eax
RETURN
@@ -2028,11 +2028,11 @@
.p2align 4
L(Byte5):
#ifdef USE_AS_STRNCMP
- cmp $5, %ebp
+ cmpl $5, %ebp
jbe L(eq)
#endif
- movzx 5(%eax), %ecx
- movzx 5(%edx), %eax
+ movzbl 5(%eax), %ecx
+ movzbl 5(%edx), %eax
sub %ecx, %eax
RETURN
@@ -2040,11 +2040,11 @@
.p2align 4
L(Byte6):
#ifdef USE_AS_STRNCMP
- cmp $6, %ebp
+ cmpl $6, %ebp
jbe L(eq)
#endif
- movzx 6(%eax), %ecx
- movzx 6(%edx), %eax
+ movzbl 6(%eax), %ecx
+ movzbl 6(%edx), %eax
sub %ecx, %eax
RETURN
@@ -2054,7 +2054,7 @@
add $8, %eax
add $8, %edx
#ifdef USE_AS_STRNCMP
- cmp $8, %ebp
+ cmpl $8, %ebp
lea -8(%ebp), %ebp
jbe L(eq)
#endif
@@ -2081,11 +2081,11 @@
jnz L(Byte6)
#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+ cmpl $7, %ebp
jbe L(eq)
#endif
- movzx 7(%eax), %ecx
- movzx 7(%edx), %eax
+ movzbl 7(%eax), %ecx
+ movzbl 7(%edx), %eax
sub %ecx, %eax
RETURN
@@ -2129,7 +2129,7 @@
test %cl, %cl
je L(eq)
- cmp $1, %ebp
+ cmpl $1, %ebp
je L(eq)
movzbl 1(%eax), %ecx
@@ -2138,7 +2138,7 @@
test %cl, %cl
je L(eq)
- cmp $2, %ebp
+ cmpl $2, %ebp
je L(eq)
movzbl 2(%eax), %ecx
@@ -2147,7 +2147,7 @@
test %cl, %cl
je L(eq)
- cmp $3, %ebp
+ cmpl $3, %ebp
je L(eq)
movzbl 3(%eax), %ecx
@@ -2156,7 +2156,7 @@
test %cl, %cl
je L(eq)
- cmp $4, %ebp
+ cmpl $4, %ebp
je L(eq)
movzbl 4(%eax), %ecx
@@ -2165,7 +2165,7 @@
test %cl, %cl
je L(eq)
- cmp $5, %ebp
+ cmpl $5, %ebp
je L(eq)
movzbl 5(%eax), %ecx
@@ -2174,7 +2174,7 @@
test %cl, %cl
je L(eq)
- cmp $6, %ebp
+ cmpl $6, %ebp
je L(eq)
movzbl 6(%eax), %ecx
@@ -2183,7 +2183,7 @@
test %cl, %cl
je L(eq)
- cmp $7, %ebp
+ cmpl $7, %ebp
je L(eq)
movzbl 7(%eax), %ecx
@@ -2193,7 +2193,7 @@
je L(eq)
- cmp $8, %ebp
+ cmpl $8, %ebp
je L(eq)
movzbl 8(%eax), %ecx
@@ -2202,7 +2202,7 @@
test %cl, %cl
je L(eq)
- cmp $9, %ebp
+ cmpl $9, %ebp
je L(eq)
movzbl 9(%eax), %ecx
@@ -2211,7 +2211,7 @@
test %cl, %cl
je L(eq)
- cmp $10, %ebp
+ cmpl $10, %ebp
je L(eq)
movzbl 10(%eax), %ecx
@@ -2220,7 +2220,7 @@
test %cl, %cl
je L(eq)
- cmp $11, %ebp
+ cmpl $11, %ebp
je L(eq)
movzbl 11(%eax), %ecx
@@ -2230,7 +2230,7 @@
je L(eq)
- cmp $12, %ebp
+ cmpl $12, %ebp
je L(eq)
movzbl 12(%eax), %ecx
@@ -2239,7 +2239,7 @@
test %cl, %cl
je L(eq)
- cmp $13, %ebp
+ cmpl $13, %ebp
je L(eq)
movzbl 13(%eax), %ecx
@@ -2248,7 +2248,7 @@
test %cl, %cl
je L(eq)
- cmp $14, %ebp
+ cmpl $14, %ebp
je L(eq)
movzbl 14(%eax), %ecx
@@ -2257,7 +2257,7 @@
test %cl, %cl
je L(eq)
- cmp $15, %ebp
+ cmpl $15, %ebp
je L(eq)
movzbl 15(%eax), %ecx
diff --git a/libc/bionic/libc_init_common.h b/libc/bionic/libc_init_common.h
index 35050a1..c55594b 100644
--- a/libc/bionic/libc_init_common.h
+++ b/libc/bionic/libc_init_common.h
@@ -35,9 +35,6 @@
void (**preinit_array)(void);
void (**init_array)(void);
void (**fini_array)(void);
-#ifndef __i386__
- void (**ctors_array)(void);
-#endif
} structors_array_t;
extern void __libc_init_common(uintptr_t *elfdata);
diff --git a/libc/bionic/libc_init_static.c b/libc/bionic/libc_init_static.c
index f97961d..97156e8 100644
--- a/libc/bionic/libc_init_static.c
+++ b/libc/bionic/libc_init_static.c
@@ -80,11 +80,6 @@
/* pre-init array. */
call_array(structors->preinit_array);
-#ifndef __i386__
- /* .ctors section initializers, for non-arm-eabi ABIs */
- call_array(structors->ctors_array);
-#endif
-
// call static constructors
call_array(structors->init_array);
diff --git a/libc/netbsd/resolv/res_send.c b/libc/netbsd/resolv/res_send.c
index 72a7ada..f3ee539 100644
--- a/libc/netbsd/resolv/res_send.c
+++ b/libc/netbsd/resolv/res_send.c
@@ -644,6 +644,11 @@
errno = ETIMEDOUT; /* no answer obtained */
} else
errno = terrno;
+
+#if USE_RESOLV_CACHE
+ _resolv_cache_query_failed(cache, buf, buflen);
+#endif
+
return (-1);
fail:
#if USE_RESOLV_CACHE
diff --git a/libc/stdio/vfprintf.c b/libc/stdio/vfprintf.c
index 427fc7f..646b6b1 100644
--- a/libc/stdio/vfprintf.c
+++ b/libc/stdio/vfprintf.c
@@ -827,6 +827,7 @@
munmap(argtable, argtablesiz);
argtable = NULL;
}
+ va_end(orgap);
return (__sferror(fp) ? EOF : ret);
/* NOTREACHED */
}
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 09d9dd8..9d882a8 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -434,26 +434,28 @@
static Elf32_Sym *
soinfo_do_lookup(soinfo *si, const char *name, Elf32_Addr *offset,
- soinfo *needed[])
+ soinfo *needed[], bool ignore_local)
{
unsigned elf_hash = elfhash(name);
- Elf32_Sym *s;
+ Elf32_Sym *s = NULL;
soinfo *lsi = si;
int i;
- /* Look for symbols in the local scope (the object who is
- * searching). This happens with C++ templates on i386 for some
- * reason.
- *
- * Notes on weak symbols:
- * The ELF specs are ambiguous about treatment of weak definitions in
- * dynamic linking. Some systems return the first definition found
- * and some the first non-weak definition. This is system dependent.
- * Here we return the first definition found for simplicity. */
+ if (!ignore_local) {
+ /* Look for symbols in the local scope (the object who is
+ * searching). This happens with C++ templates on i386 for some
+ * reason.
+ *
+ * Notes on weak symbols:
+ * The ELF specs are ambiguous about treatment of weak definitions in
+ * dynamic linking. Some systems return the first definition found
+ * and some the first non-weak definition. This is system dependent.
+ * Here we return the first definition found for simplicity. */
- s = soinfo_elf_lookup(si, elf_hash, name);
- if(s != NULL)
- goto done;
+ s = soinfo_elf_lookup(si, elf_hash, name);
+ if(s != NULL)
+ goto done;
+ }
/* Next, look for it in the preloads list */
for(i = 0; preloads[i] != NULL; i++) {
@@ -684,6 +686,7 @@
if (hdr->e_ident[EI_MAG1] != ELFMAG1) return -1;
if (hdr->e_ident[EI_MAG2] != ELFMAG2) return -1;
if (hdr->e_ident[EI_MAG3] != ELFMAG3) return -1;
+ if (hdr->e_type != ET_DYN) return -1;
/* TODO: Should we verify anything else in the header? */
#ifdef ANDROID_ARM_LINKER
@@ -959,7 +962,11 @@
}
if(sym != 0) {
sym_name = (char *)(strtab + symtab[sym].st_name);
- s = soinfo_do_lookup(si, sym_name, &offset, needed);
+ bool ignore_local = false;
+#if defined(ANDROID_ARM_LINKER)
+ ignore_local = (type == R_ARM_COPY);
+#endif
+ s = soinfo_do_lookup(si, sym_name, &offset, needed, ignore_local);
if(s == NULL) {
/* We only allow an undefined symbol if this is a weak
reference.. */
@@ -1139,10 +1146,29 @@
#ifdef ANDROID_ARM_LINKER
case R_ARM_COPY:
+ if ((si->flags & FLAG_EXE) == 0) {
+ /*
+ * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
+ *
+ * Section 4.7.1.10 "Dynamic relocations"
+ * R_ARM_COPY may only appear in executable objects where e_type is
+ * set to ET_EXEC.
+ *
+ * TODO: FLAG_EXE is set for both ET_DYN and ET_EXEC executables.
+ * We should explicitly disallow ET_DYN executables from having
+ * R_ARM_COPY relocations.
+ */
+ DL_ERR("%s R_ARM_COPY relocations only supported for ET_EXEC", si->name);
+ return -1;
+ }
count_relocation(kRelocCopy);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "%5d RELO %08x <- %d @ %08x %s\n", pid,
reloc, s->st_size, sym_addr, sym_name);
+ if (reloc == sym_addr) {
+ DL_ERR("Internal linker error detected. reloc == symaddr");
+ return -1;
+ }
memcpy((void*)reloc, (void*)sym_addr, s->st_size);
break;
#endif /* ANDROID_ARM_LINKER */
@@ -1201,7 +1227,7 @@
/* This is an undefined reference... try to locate it */
sym_name = si->strtab + sym->st_name;
- s = soinfo_do_lookup(si, sym_name, &base, needed);
+ s = soinfo_do_lookup(si, sym_name, &base, needed, false);
if (s == NULL) {
/* We only allow an undefined symbol if this is a weak
reference.. */
@@ -1804,7 +1830,7 @@
exit(-1);
}
- /* bootstrap the link map, the main exe always needs to be first */
+ /* bootstrap the link map, the main exe always needs to be first */
si->flags |= FLAG_EXE;
link_map* map = &(si->linkmap);
@@ -1839,7 +1865,7 @@
&linker_soinfo.dynamic, NULL);
insert_soinfo_into_debug_map(&linker_soinfo);
- /* extract information passed from the kernel */
+ /* extract information passed from the kernel */
while(vecs[0] != 0){
switch(vecs[0]){
case AT_PHDR:
diff --git a/linker/linker_debug.h b/linker/linker_debug.h
index f1b6208..48a7abf 100644
--- a/linker/linker_debug.h
+++ b/linker/linker_debug.h
@@ -61,6 +61,11 @@
*/
#if LINKER_DEBUG
#include "linker_format.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
extern int debug_verbosity;
#if LINKER_DEBUG_TO_LOG
extern int format_log(int, const char *, const char *, ...);
@@ -75,6 +80,11 @@
if (debug_verbosity > (v)) format_fd(1, x); \
} while (0)
#endif /* !LINKER_DEBUG_TO_LOG */
+
+#ifdef __cplusplus
+};
+#endif
+
#else /* !LINKER_DEBUG */
#define _PRINTVF(v,f,x...) do {} while(0)
#endif /* LINKER_DEBUG */