1*8d67ca89SAndroid Build Coastguard Worker /* 2*8d67ca89SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*8d67ca89SAndroid Build Coastguard Worker * 4*8d67ca89SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*8d67ca89SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*8d67ca89SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*8d67ca89SAndroid Build Coastguard Worker * 8*8d67ca89SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*8d67ca89SAndroid Build Coastguard Worker * 10*8d67ca89SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*8d67ca89SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*8d67ca89SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*8d67ca89SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*8d67ca89SAndroid Build Coastguard Worker * limitations under the License. 15*8d67ca89SAndroid Build Coastguard Worker */ 16*8d67ca89SAndroid Build Coastguard Worker 17*8d67ca89SAndroid Build Coastguard Worker #include <dlfcn.h> 18*8d67ca89SAndroid Build Coastguard Worker #include <errno.h> 19*8d67ca89SAndroid Build Coastguard Worker #include <stdio.h> 20*8d67ca89SAndroid Build Coastguard Worker #if __has_include(<sys/auxv.h>) 21*8d67ca89SAndroid Build Coastguard Worker #include <sys/auxv.h> 22*8d67ca89SAndroid Build Coastguard Worker #endif 23*8d67ca89SAndroid Build Coastguard Worker #include <unistd.h> 24*8d67ca89SAndroid Build Coastguard Worker 25*8d67ca89SAndroid Build Coastguard Worker extern "C" void foo(); 26*8d67ca89SAndroid Build Coastguard Worker void lib1_call_funcs(); 27*8d67ca89SAndroid Build Coastguard Worker __attribute__((weak)) void lib3_call_funcs(); 28*8d67ca89SAndroid Build Coastguard Worker main()29*8d67ca89SAndroid Build Coastguard Workerint main() { 30*8d67ca89SAndroid Build Coastguard Worker bool skip_vdso_check = false; 31*8d67ca89SAndroid Build Coastguard Worker #if __has_include(<sys/auxv.h>) 32*8d67ca89SAndroid Build Coastguard Worker if (getauxval(AT_SYSINFO_EHDR) == 0) { 33*8d67ca89SAndroid Build Coastguard Worker skip_vdso_check = true; 34*8d67ca89SAndroid Build Coastguard Worker } 35*8d67ca89SAndroid Build Coastguard Worker #endif 36*8d67ca89SAndroid Build Coastguard Worker 37*8d67ca89SAndroid Build Coastguard Worker if (!skip_vdso_check) { 38*8d67ca89SAndroid Build Coastguard Worker const char* vdso_name = "linux-vdso.so.1"; 39*8d67ca89SAndroid Build Coastguard Worker #if defined(__i386__) 40*8d67ca89SAndroid Build Coastguard Worker vdso_name = "linux-gate.so.1"; 41*8d67ca89SAndroid Build Coastguard Worker #endif 42*8d67ca89SAndroid Build Coastguard Worker void* handle = dlopen(vdso_name, RTLD_NOW); 43*8d67ca89SAndroid Build Coastguard Worker if (handle == nullptr) { 44*8d67ca89SAndroid Build Coastguard Worker printf("%s", dlerror()); 45*8d67ca89SAndroid Build Coastguard Worker return 1; 46*8d67ca89SAndroid Build Coastguard Worker } 47*8d67ca89SAndroid Build Coastguard Worker dlclose(handle); 48*8d67ca89SAndroid Build Coastguard Worker } 49*8d67ca89SAndroid Build Coastguard Worker 50*8d67ca89SAndroid Build Coastguard Worker foo(); 51*8d67ca89SAndroid Build Coastguard Worker lib1_call_funcs(); 52*8d67ca89SAndroid Build Coastguard Worker if (lib3_call_funcs) lib3_call_funcs(); 53*8d67ca89SAndroid Build Coastguard Worker 54*8d67ca89SAndroid Build Coastguard Worker return 0; 55*8d67ca89SAndroid Build Coastguard Worker } 56