1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <dlfcn.h> 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <stdio.h> 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)extern "C" bool Zoo() { 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printf("%s: Entering\n", __FUNCTION__); 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void* bar_lib = dlopen("libbar.so", RTLD_NOW); 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!bar_lib) { 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fprintf(stderr, "Could not libbar.so: %s\n", dlerror()); 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printf("%s: Opened libbar.so @%p\n", __FUNCTION__, bar_lib); 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void (*bar_func)(); 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bar_func = reinterpret_cast<void (*)()>(dlsym(bar_lib, "Bar")); 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!bar_func) { 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fprintf(stderr, "Could not find 'Bar' symbol in libbar.so\n"); 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printf("%s: Found 'Bar' symbol at @%p\n", __FUNCTION__, bar_func); 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Call it. 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printf("%s: Calling Bar()\n", __FUNCTION__); 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*bar_func)(); 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printf("%s: Closing libbar.so\n", __FUNCTION__); 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dlclose(bar_lib); 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printf("%s: Exiting\n", __FUNCTION__); 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 36