I've been searching a way to make a shared library (let's name the library libbar.so
) delay loaded on Linux and it should hopefully be realized with a help from only a linker, not modifying anything on the source code written in C++; I mean I don't want to invoke dlopen()
nor dlsym()
in the source code of the parent library (let's name it libfoo.so
) to invoke a function of libbar.so
because they make the source code messy and the maintenance process difficult. (In short, I'm expecting to go on the similar way to Visual Studio's /DELAYLOAD
option even on Linux)
Anyway, I've found some uncertain information pieces related to my question on the internet so far, so it would be very nice to have the answers from you all for the following questions to make the information clear.
dlopen()
family the only way to make a shared library delay loaded on Linux?I tested to pass -zlazy
flag to GCC (g++) with a path to the library, it seemed to accept the flag but the behavior did not look making libbar.so
delay loaded (Not having libbar.so
, I was expecting to have an exception at the first call of libbar.so
, but the exception actually raised before entering to libfoo.so
). On the other hand, Clang (clang++
) left a warning that it ignored the option flag.
Best regards,
Shared libraries are the most common way to manage dependencies on Linux systems. These shared resources are loaded into memory before the application starts, and when several processes require the same library, it will be loaded only once on the system. This feature saves on memory usage by the application.
Dynamic libraries are loaded at runtime and are not included in the executable. This reduces the size of executable files. Dynamic libraries use relocatable code format. This code is turned into absolute code by the runtime linker.
LIBS = -L$(LIB) -lfuse -lsqlite3 -lkw_taglib -ltag_c -ltag -Wl,-rpath=. So the binary will search in the current directory for dyn-libraries. However, you add ../lib to your LD_LIBRARY_PATH later, for execution of the binary, so the given path .
Delay loading is NOT a runtime feature. MSVC++ implemented it without help from Windows. And like dlopen
is the only way on Linux, GetProcAddress
is the only runtime method on Windows.
So, what is delay loading then? It's very simple: Any call to a DLL has to go through a pointer (since you don't know where it will load). This has always been handled by the compiler and linker for you. But with delay loading, MSVC++ sets this pointer initially to a stub that calls LoadLibrary
and GetProcAddress
for you.
Clang can do the same without help from ld
. At runtime, it's just an ordinary dlopen
call, and Linux cannot determine that Clang inserted it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With