diff options
author | Tamas Berghammer <tberghammer@google.com> | 2015-12-11 16:24:14 +0000 |
---|---|---|
committer | Tamas Berghammer <tberghammer@google.com> | 2015-12-11 16:24:14 +0000 |
commit | e43482b626b5f8e8fe85aad0c91fd8e637f67cd4 (patch) | |
tree | 45a6102b113f507e6ffea6d03932b7ed30d46054 /lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp | |
parent | 734a0b3f81e24d106e1e4b46d000a11f865a42e6 (diff) | |
download | bcm5719-llvm-e43482b626b5f8e8fe85aad0c91fd8e637f67cd4.tar.gz bcm5719-llvm-e43482b626b5f8e8fe85aad0c91fd8e637f67cd4.zip |
Create test for llvm.org/pr25806
LLDB don't detect the loading of a shared object file linked against the
main executable before the static initializers are executed for the
given module. Because of this it is not possible to get breakpoint hits
in these static initializers and to display proper debug info in case of
a crash in these codes.
llvm-svn: 255342
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp')
-rw-r--r-- | lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp new file mode 100644 index 00000000000..bff9a317606 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/load_unload/main.cpp @@ -0,0 +1,80 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include <stdio.h> +#include <dlfcn.h> +#include <limits.h> +#include <string.h> +#include <unistd.h> +#include <libgen.h> +#include <stdlib.h> + +int +main (int argc, char const *argv[]) +{ +#if defined (__APPLE__) + const char *a_name = "@executable_path/libloadunload_a.dylib"; + const char *c_name = "@executable_path/libloadunload_c.dylib"; +#else + const char *a_name = "libloadunload_a.so"; + const char *c_name = "libloadunload_c.so"; +#endif + void *a_dylib_handle = NULL; + void *c_dylib_handle = NULL; + int (*a_function) (void); + + a_dylib_handle = dlopen (a_name, RTLD_NOW); // Set break point at this line for test_lldb_process_load_and_unload_commands(). + if (a_dylib_handle == NULL) + { + fprintf (stderr, "%s\n", dlerror()); + exit (1); + } + + a_function = (int (*) ()) dlsym (a_dylib_handle, "a_function"); + if (a_function == NULL) + { + fprintf (stderr, "%s\n", dlerror()); + exit (2); + } + printf ("First time around, got: %d\n", a_function ()); + dlclose (a_dylib_handle); + + c_dylib_handle = dlopen (c_name, RTLD_NOW); + if (c_dylib_handle == NULL) + { + fprintf (stderr, "%s\n", dlerror()); + exit (3); + } + a_function = (int (*) ()) dlsym (c_dylib_handle, "c_function"); + if (a_function == NULL) + { + fprintf (stderr, "%s\n", dlerror()); + exit (4); + } + + a_dylib_handle = dlopen (a_name, RTLD_NOW); + if (a_dylib_handle == NULL) + { + fprintf (stderr, "%s\n", dlerror()); + exit (5); + } + + a_function = (int (*) ()) dlsym (a_dylib_handle, "a_function"); + if (a_function == NULL) + { + fprintf (stderr, "%s\n", dlerror()); + exit (6); + } + printf ("Second time around, got: %d\n", a_function ()); + dlclose (a_dylib_handle); + + int d_function(void); + printf ("d_function returns: %d\n", d_function()); + + return 0; +} |