From bfa15e464ecfb43d93e468f166d91e4e6265f300 Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Wed, 7 Jan 2015 15:05:49 -0800 Subject: [PATCH] Set linux 32bit personality for 32 bit processes Bug: 18069809 Change-Id: Ie143d56b0f8f03510dc451649291067e1add1d2f --- linker/linker.cpp | 7 +++++++ tests/Android.mk | 1 + tests/sys_personality_test.cpp | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 tests/sys_personality_test.cpp diff --git a/linker/linker.cpp b/linker/linker.cpp index babefeb3c..b8a88004d 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -2663,6 +2664,12 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW( ldpreload_env = linker_env_get("LD_PRELOAD"); } +#if !defined(__LP64__) + if (personality(PER_LINUX32) == -1) { + __libc_fatal("error setting PER_LINUX32 personality: %s", strerror(errno)); + } +#endif + INFO("[ android linker & debugger ]"); soinfo* si = soinfo_alloc(args.argv[0], nullptr, 0, RTLD_GLOBAL); diff --git a/tests/Android.mk b/tests/Android.mk index dfb89d266..38d85f848 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -93,6 +93,7 @@ libBionicStandardTests_src_files := \ sstream_test.cpp \ sys_epoll_test.cpp \ sys_mman_test.cpp \ + sys_personality_test.cpp \ sys_resource_test.cpp \ sys_select_test.cpp \ sys_sendfile_test.cpp \ diff --git a/tests/sys_personality_test.cpp b/tests/sys_personality_test.cpp new file mode 100644 index 000000000..55a023dfa --- /dev/null +++ b/tests/sys_personality_test.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +TEST(sys_personality, current_persona) { + int persona = personality(0xffffffff); +#if defined(__BIONIC__) +#if defined(__LP64__) + ASSERT_EQ(PER_LINUX, persona); +#else + ASSERT_EQ(PER_LINUX32, persona); +#endif +#else + // GLIBC does not set persona prior process startup - it is always PER_LINUX; + ASSERT_EQ(PER_LINUX, persona); +#endif +}