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)}