|
|
Message-ID: <f8fc13a9-7af4-193f-9554-41f7fda36c85@bell-sw.com>
Date: Thu, 21 May 2020 14:27:24 +0300
From: Alexander Scherbatiy <alexander.scherbatiy@...l-sw.com>
To: musl@...ts.openwall.com
Subject: Shared library loading
Hello,
I use Alpine Linux 3.11.6 with musl libc (x86_64) version 1.1.24.
I have two shared libraries "a" and "b" each of which is placed in its
own directory and lib "b" depends on "a".
First, I use dlopen to load lib "a" with "RTLD_NOW | RTLD_GLOBAL" flags.
Second, I load lib "b" with flag "RTLD_LAZY".
The "b" library loading works on my Ubuntu 19.10 and fails on Alpine
3.11.6 with message:
dlopen failed: Error loading shared library liba.so: No such file or
directory (needed by /root/load-lib-sample/bin/b/libb.so)
Should it work on Alpine with musl libc as well?
Below is the source code which reproduces the library loading issue:
--- include/a.h ---
void test_a();
--- include/b.h ---
void test_b();
--- src/a.c ---
#include "a.h"
#include <stdio.h>
void test_a() {
printf("test a\n");
}
--- src/b.c ---
#include "b.h"
#include "a.h"
#include <stdio.h>
void test_b() {
printf("test b\n");
test_a();
}
--- src/main.c ---
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
void *open_lib(const char* base_dir, const char* lib_dir, const char
*lib_name,int flags) {
char path_lib[256];
sprintf(path_lib, "%s/%s/%s", base_dir, lib_dir, lib_name);
printf("[load lib] %s\n", path_lib);
void *handle = dlopen(path_lib, flags);
if (!handle) {
fprintf(stderr, "dlopen failed: %s\n", dlerror());
exit(EXIT_FAILURE);
}
return handle;
}
void call_func(void *handle, const char *func_name) {
printf("[call func] %s\n", func_name);
void (*func_t)(void);
*(void **) (&func_t) = dlsym(handle, func_name);
char *error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
(*func_t)();
}
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("provide base dir.\n");
exit(-1);
}
void *handle_a = open_lib(argv[1], "a", "liba.so", RTLD_NOW |
RTLD_GLOBAL);
call_func(handle_a, "test_a");
void *handle_b = open_lib(argv[1], "b", "libb.so", RTLD_LAZY);
call_func(handle_b, "test_b");
dlclose(handle_b);
dlclose(handle_a);
}
--- build.sh ---
rm -rf ./bin
mkdir -p bin bin/a bin/b
DIR_BIN=$(pwd)/bin
gcc -g -shared src/a.c -Wl,-soname=liba.so -Iinclude -o bin/a/liba.so
gcc -g -shared src/b.c -Wl,-soname=libb.so -Iinclude -la -Lbin/a -o
bin/b/libb.so
gcc -g src/main.c -Iinclude -o bin/main -ldl
./bin/main $DIR_BIN
--- --- ---
Output on Ubuntu 19.10
----------
./build.sh
[load lib] /home/user/load-lib-sample/bin/a/liba.so
[call func] test_a
test a
[load lib] /home/user/load-lib-sample/bin/b/libb.so
[call func] test_b
test b
test a
----------
Output on Alpine 3.11.6
----------
./build.sh
[load lib] /root/load-lib-sample/bin/a/liba.so
[call func] test_a
test a
[load lib] /root/load-lib-sample/bin/b/libb.so
dlopen failed: Error loading shared library liba.so: No such file or
directory (needed by /root/load-lib-sample/bin/b/libb.so)
----------
Thanks,
Alexander.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.