Summary: | dlopen (without RTLD_GLOBAL) overrides weak symbols in libc | ||
---|---|---|---|
Product: | Base System | Reporter: | Alex S <iwtcex> |
Component: | bin | Assignee: | freebsd-bugs (Nobody) <bugs> |
Status: | New --- | ||
Severity: | Affects Some People | CC: | Alexander88207, emaste, gerald, kib, robert.ayrapetyan |
Priority: | --- | ||
Version: | 12.2-RELEASE | ||
Hardware: | Any | ||
OS: | Any |
Description
Alex S
2020-12-31 16:08:30 UTC
Yes this is really a libc problem, not rtld. We do not use internal namespace consistently. OTOH for malloc(3) related functions, I suspect the decision was deliberate to make it possible to interpose system implementation with any other user provided with LD_PRELOAD. > OTOH for malloc(3) related functions, I suspect the decision was deliberate
to make it possible to interpose system implementation with any other user
provided with LD_PRELOAD.
Well, I tested (before filling the bug) whether this works in general and, as expected, it doesn't:
% cat weak_sym_override_test2.c
#include <assert.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
#if defined(ORIG)
void __attribute__((weak)) test() {
printf("original\n");
}
void wrapper() {
test();
}
#elif defined(OVERRIDE)
void test() {
printf("override\n");
}
#else
extern void wrapper();
int main() {
assert(dlopen("override.so", RTLD_NOW) != NULL);
wrapper();
return 0;
}
#endif
% cc -shared -fPIC -DORIG weak_sym_override_test2.c -o orig.so
% cc -shared -fPIC -DOVERRIDE weak_sym_override_test2.c -o override.so
% cc weak_sym_override_test2.c orig.so -Wl,-rpath,. -o test
% ./test
original
Did I miss some compilation flags or something? How do I deliberately get this effect?
You need to LD_PRELOAD your interposer, I noted it in my comment #1. solo% LD_PRELOAD=./override.so ./test override In your example, dlopened object would be added at the end of the global list and in fact its symbols are interposed by the objects loaded at startup, i.e. the effect is reverse. (And your example misses RTLD_GLOBAL, but does not matter much). |