Skip to content

Commit

Permalink
8313616: support loading library members on AIX in os::dll_load
Browse files Browse the repository at this point in the history
Reviewed-by: phh
Backport-of: 23fe2ece586d3ed750e905e1b71a2cd1da91f335
  • Loading branch information
MBaesken committed Nov 24, 2023
1 parent 220b36c commit ecb199a
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 11 deletions.
9 changes: 6 additions & 3 deletions src/hotspot/os/aix/libodm_aix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,16 @@
#include <dlfcn.h>
#include <string.h>
#include "runtime/arguments.hpp"
#include "runtime/os.hpp"


dynamicOdm::dynamicOdm() {
const char *libodmname = "/usr/lib/libodm.a(shr_64.o)";
_libhandle = dlopen(libodmname, RTLD_MEMBER | RTLD_NOW);
const char* libodmname = "/usr/lib/libodm.a(shr_64.o)";
char ebuf[512];
void* _libhandle = os::dll_load(libodmname, ebuf, sizeof(ebuf));

if (!_libhandle) {
trcVerbose("Couldn't open %s", libodmname);
trcVerbose("Cannot load %s (error %s)", libodmname, ebuf);
return;
}
_odm_initialize = (fun_odm_initialize )dlsym(_libhandle, "odm_initialize" );
Expand Down
9 changes: 5 additions & 4 deletions src/hotspot/os/aix/libperfstat_aix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

#include "libperfstat_aix.hpp"
#include "misc_aix.hpp"
#include "runtime/os.hpp"

#include <dlfcn.h>

Expand Down Expand Up @@ -71,11 +72,11 @@ static fun_perfstat_reset_t g_fun_perfstat_reset = nullptr;
static fun_wpar_getcid_t g_fun_wpar_getcid = nullptr;

bool libperfstat::init() {

// Dynamically load the libperfstat porting library.
g_libhandle = dlopen("/usr/lib/libperfstat.a(shr_64.o)", RTLD_MEMBER | RTLD_NOW);
const char* libperfstat = "/usr/lib/libperfstat.a(shr_64.o)";
char ebuf[512];
g_libhandle = os::dll_load(libperfstat, ebuf, sizeof(ebuf));
if (!g_libhandle) {
trcVerbose("Cannot load libperfstat.a (dlerror: %s)", dlerror());
trcVerbose("Cannot load %s (error: %s)", libperfstat, ebuf);
return false;
}

Expand Down
15 changes: 11 additions & 4 deletions src/hotspot/os/aix/os_aix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1098,8 +1098,6 @@ bool os::dll_address_to_library_name(address addr, char* buf,
return true;
}

// Loads .dll/.so and in case of error it checks if .dll/.so was built
// for the same architecture as Hotspot is running on.
void *os::dll_load(const char *filename, char *ebuf, int ebuflen) {

log_info(os)("attempting shared library load of %s", filename);
Expand All @@ -1114,8 +1112,17 @@ void *os::dll_load(const char *filename, char *ebuf, int ebuflen) {
return nullptr;
}

// RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants.
void * result= ::dlopen(filename, RTLD_LAZY);
// RTLD_LAZY has currently the same behavior as RTLD_NOW
// The dl is loaded immediately with all its dependants.
int dflags = RTLD_LAZY;
// check for filename ending with ')', it indicates we want to load
// a MEMBER module that is a member of an archive.
int flen = strlen(filename);
if (flen > 0 && filename[flen - 1] == ')') {
dflags |= RTLD_MEMBER;
}

void * result= ::dlopen(filename, dflags);
if (result != nullptr) {
Events::log_dll_message(nullptr, "Loaded shared library %s", filename);
// Reload dll cache. Don't do this in signal handling.
Expand Down

1 comment on commit ecb199a

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.