dlfcn.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Copyright (c) 2021, Gunnar Beutner <gunnar@beutner.name>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/String.h>
  7. #include <AK/Types.h>
  8. #include <LibDl/dlfcn.h>
  9. #include <LibDl/dlfcn_integration.h>
  10. #include <string.h>
  11. // FIXME: use thread_local and a String once TLS works
  12. __thread char* s_dlerror_text = NULL;
  13. __thread bool s_dlerror_retrieved = false;
  14. static void store_error(const String& error)
  15. {
  16. free(s_dlerror_text);
  17. s_dlerror_text = strdup(error.characters());
  18. s_dlerror_retrieved = false;
  19. }
  20. int dlclose(void* handle)
  21. {
  22. auto result = __dlclose(handle);
  23. if (result.is_error()) {
  24. store_error(result.error().text);
  25. return -1;
  26. }
  27. return 0;
  28. }
  29. char* dlerror()
  30. {
  31. if (s_dlerror_retrieved) {
  32. free(s_dlerror_text);
  33. s_dlerror_text = nullptr;
  34. }
  35. s_dlerror_retrieved = true;
  36. return const_cast<char*>(s_dlerror_text);
  37. }
  38. void* dlopen(const char* filename, int flags)
  39. {
  40. auto result = __dlopen(filename, flags);
  41. if (result.is_error()) {
  42. store_error(result.error().text);
  43. return nullptr;
  44. }
  45. return result.value();
  46. }
  47. void* dlsym(void* handle, const char* symbol_name)
  48. {
  49. auto result = __dlsym(handle, symbol_name);
  50. if (result.is_error()) {
  51. store_error(result.error().text);
  52. return nullptr;
  53. }
  54. return result.value();
  55. }
  56. int dladdr(void* addr, Dl_info* info)
  57. {
  58. auto result = __dladdr(addr, info);
  59. if (result.is_error()) {
  60. // FIXME: According to the man page glibc does _not_ make the error
  61. // available via dlerror(), however we do. Does this break anything?
  62. store_error(result.error().text);
  63. return 0;
  64. }
  65. return 1;
  66. }