12c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich/* 22c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * Copyright (C) 2013 The Android Open Source Project 32c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * 42c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * Licensed under the Apache License, Version 2.0 (the "License"); 52c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * you may not use this file except in compliance with the License. 62c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * You may obtain a copy of the License at 72c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * 82c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * http://www.apache.org/licenses/LICENSE-2.0 92c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * 102c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * Unless required by applicable law or agreed to in writing, software 112c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * distributed under the License is distributed on an "AS IS" BASIS, 122c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * See the License for the specific language governing permissions and 142c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * limitations under the License. 152c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich */ 162c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich 172c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <sys/cdefs.h> 182c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <features.h> 192c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <gtest/gtest.h> 202c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich 212c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich// getauxval() was only added as of glibc version 2.16. 222c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich// See: http://lwn.net/Articles/519085/ 232c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich// Don't try to compile this code on older glibc versions. 242c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich 252c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#if defined(__BIONIC__) 262c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich #define GETAUXVAL_CAN_COMPILE 1 272c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#elif defined(__GLIBC_PREREQ) 282c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich #if __GLIBC_PREREQ(2, 16) 292c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich #define GETAUXVAL_CAN_COMPILE 1 302c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich #endif 312c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#endif 322c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich 332c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#if defined(GETAUXVAL_CAN_COMPILE) 342c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <sys/auxv.h> 35f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif 362c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich 372c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick KralevichTEST(getauxval, expected_values) { 38f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(GETAUXVAL_CAN_COMPILE) 392c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_EQ((unsigned long int) 0, getauxval(AT_SECURE)); 402c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_EQ(getuid(), getauxval(AT_UID)); 412c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_EQ(geteuid(), getauxval(AT_EUID)); 422c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_EQ(getgid(), getauxval(AT_GID)); 432c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_EQ(getegid(), getauxval(AT_EGID)); 442c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_EQ((unsigned long int) getpagesize(), getauxval(AT_PAGESZ)); 452c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich 462c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_NE((unsigned long int) 0, getauxval(AT_PHDR)); 472c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_NE((unsigned long int) 0, getauxval(AT_PHNUM)); 482c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_NE((unsigned long int) 0, getauxval(AT_ENTRY)); 492c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_NE((unsigned long int) 0, getauxval(AT_PAGESZ)); 50f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else 51f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris GTEST_LOG_(INFO) << "This test does nothing.\n"; 52f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif 532c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich} 542c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich 552c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick KralevichTEST(getauxval, unexpected_values) { 56f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(GETAUXVAL_CAN_COMPILE) 572c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich ASSERT_EQ((unsigned long int) 0, getauxval(0xdeadbeef)); 58f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else 59f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris GTEST_LOG_(INFO) << "This test does nothing.\n"; 60f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif 612c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich} 62