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)// A crazy linker test to: 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - Load a library (libbar.so) with the linker, which depends on 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// another library (libfoo.so) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - Find the address of the "Bar" function in libbar.so. 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - Call the Bar() function, which ends up calling Foo() in libfoo.so 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// - Close the library. 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <stdio.h> 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <crazy_linker.h> 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "test_util.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef void (*FunctionPtr)(); 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int main() { 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crazy_context_t* context = crazy_context_create(); 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crazy_library_t* library; 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // DEBUG 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crazy_context_set_load_address(context, 0x20000000); 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Load libbar.so 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!crazy_library_open(&library, "libbar.so", context)) { 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Panic("Could not open library: %s\n", crazy_context_get_error(context)); 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Find the "Bar" symbol. 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FunctionPtr bar_func; 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!crazy_library_find_symbol( 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) library, "Bar", reinterpret_cast<void**>(&bar_func))) { 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Panic("Could not find 'Bar' in libbar.so\n"); 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Call it. 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (*bar_func)(); 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Find the "Foo" symbol from libbar.so 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FunctionPtr foo_func; 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!crazy_library_find_symbol( 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) library, "Foo", reinterpret_cast<void**>(&foo_func))) { 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Panic("Could not find 'Foo' from libbar.so\n"); 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Close the library. 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) printf("Closing libbar.so\n"); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crazy_library_close(library); 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) crazy_context_destroy(context); 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return 0; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}