From 69a5fb951d69689dedd83cb033ae3dcd0ef05b65 Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Fri, 15 May 2015 17:53:39 -0700 Subject: [PATCH] Apply work around b/19059885 to x86 Bug: http://b/19059885 Bug: http://b/21203348 Change-Id: Ic375e9f877d68de8f866d17362879a7dde638465 --- libc/Android.mk | 2 ++ libm/Android.mk | 1 + linker/Android.mk | 3 +++ linker/linker.cpp | 8 ++++---- linker/linker.h | 10 +++++----- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/libc/Android.mk b/libc/Android.mk index 967949451..8b4f90edb 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -1392,6 +1392,7 @@ LOCAL_LDFLAGS_64 := -Wl,--exclude-libs,libgcc.a # TODO: This is to work around b/19059885. Remove after root cause is fixed LOCAL_LDFLAGS_arm := -Wl,--hash-style=both +LOCAL_LDFLAGS_x86 := -Wl,--hash-style=both $(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags)) $(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_arch_dynamic_src_files)) @@ -1522,6 +1523,7 @@ LOCAL_CPPFLAGS := $(libc_common_cppflags) # TODO: This is to work around b/19059885. Remove after root cause is fixed LOCAL_LDFLAGS_arm := -Wl,--hash-style=both +LOCAL_LDFLAGS_x86 := -Wl,--hash-style=both LOCAL_SRC_FILES := $(libstdcxx_common_src_files) LOCAL_MODULE:= libstdc++ diff --git a/libm/Android.mk b/libm/Android.mk index 529dda858..4a5bbad57 100644 --- a/libm/Android.mk +++ b/libm/Android.mk @@ -515,6 +515,7 @@ include $(CLEAR_VARS) # TODO: This is to work around b/19059885. Remove after root cause is fixed LOCAL_LDFLAGS_arm := -Wl,--hash-style=both +LOCAL_LDFLAGS_x86 := -Wl,--hash-style=both LOCAL_MODULE := libm LOCAL_CLANG := $(libm_clang) diff --git a/linker/Android.mk b/linker/Android.mk index 5bdc2f901..4a7da7608 100644 --- a/linker/Android.mk +++ b/linker/Android.mk @@ -35,6 +35,9 @@ LOCAL_CFLAGS += \ -fvisibility=hidden \ -Wall -Wextra -Wunused -Werror \ +LOCAL_CFLAGS_arm += -D__work_around_b_19059885__ +LOCAL_CFLAGS_x86 += -D__work_around_b_19059885__ + LOCAL_CONLYFLAGS += \ -std=gnu99 \ diff --git a/linker/linker.cpp b/linker/linker.cpp index 9d796ae66..f9df8315a 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1544,7 +1544,7 @@ static void soinfo_unload(soinfo* root) { } } } else { -#if !defined(__arm__) +#if !defined(__work_around_b_19059885__) __libc_fatal("soinfo for \"%s\"@%p has no version", si->get_realpath(), si); #else PRINT("warning: soinfo for \"%s\"@%p has no version", si->get_realpath(), si); @@ -2270,7 +2270,7 @@ void soinfo::set_dt_flags_1(uint32_t dt_flags_1) { } const char* soinfo::get_realpath() const { -#if defined(__arm__) +#if defined(__work_around_b_19059885__) if (has_min_version(2)) { return realpath_.c_str(); } else { @@ -2282,7 +2282,7 @@ const char* soinfo::get_realpath() const { } const char* soinfo::get_soname() const { -#if defined(__arm__) +#if defined(__work_around_b_19059885__) if (has_min_version(2)) { return soname_; } else { @@ -2820,7 +2820,7 @@ bool soinfo::prelink_image() { for (ElfW(Dyn)* d = dynamic; d->d_tag != DT_NULL; ++d) { if (d->d_tag == DT_SONAME) { soname_ = get_string(d->d_un.d_val); -#if defined(__arm__) +#if defined(__work_around_b_19059885__) strlcpy(old_name_, soname_, sizeof(old_name_)); #endif break; diff --git a/linker/linker.h b/linker/linker.h index dc8c6e08a..c7118ea6a 100644 --- a/linker/linker.h +++ b/linker/linker.h @@ -97,7 +97,7 @@ #define SOINFO_VERSION 2 -#if defined(__arm__) +#if defined(__work_around_b_19059885__) #define SOINFO_NAME_LEN 128 #endif @@ -172,7 +172,7 @@ class VersionTracker { struct soinfo { public: typedef LinkedList soinfo_list_t; -#if defined(__arm__) +#if defined(__work_around_b_19059885__) private: char old_name_[SOINFO_NAME_LEN]; #endif @@ -183,13 +183,13 @@ struct soinfo { ElfW(Addr) base; size_t size; -#if defined(__arm__) +#if defined(__work_around_b_19059885__) uint32_t unused1; // DO NOT USE, maintained for compatibility. #endif ElfW(Dyn)* dynamic; -#if defined(__arm__) +#if defined(__work_around_b_19059885__) uint32_t unused2; // DO NOT USE, maintained for compatibility uint32_t unused3; // DO NOT USE, maintained for compatibility #endif @@ -305,7 +305,7 @@ struct soinfo { bool is_gnu_hash() const; bool inline has_min_version(uint32_t min_version __unused) const { -#if defined(__arm__) +#if defined(__work_around_b_19059885__) return (flags_ & FLAG_NEW_SOINFO) != 0 && version_ >= min_version; #else return true; -- 2.11.0