I was trying the issue mentioned at link: https://sourceware.org/ml/libc-alpha/2009-06/msg00168.html
I did some modification in the code as mentioned below:
>> Cat libdep.c
#include <stdio.h>
int duplicate = 'u';
int get_duplicate() {
printf("libdep sees duplicate as: %c\n", duplicate);
printf("libdep sees duplicate address as: %x\n", &duplicate);
return duplicate;
}
--------------------------------------------------------------------------------------
>> Cat dynamic.c
#include <stdio.h>
extern int duplicate;
int run() {
duplicate = 'd';
printf("dynamic sees duplicate from libdep as: %c\n", duplicate);
printf("dynamic sees duplicate address as: %x\n", &duplicate);
printf("but libdep sees duplicate from main as: %c\n", get_duplicate());
return 0;
}
-------------------------------------------------------------------------------------------------
Cat main.c
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
extern int duplicate;
int main() {
void *h;
int (*run)();
duplicate = 'm';
printf("main sees duplicate as: %c\n", duplicate);
printf("main sees duplicate address as: %x\n", &duplicate);
h = dlopen("./dynamic.so", RTLD_LAZY | RTLD_DEEPBIND);
if (!h)
abort();
run = dlsym(h, "run");
if (!run)
abort();
(*run)();
}
Compiling the above files:
gcc -ggdb3 -shared -fPIC libdep.c -o libdep.so
gcc -ggdb3 -shared -fPIC dynamic.c -Wl,-rpath,. -L. -ldep -o dynamic.so
gcc -ggdb3 main.c -Wl,-rpath,. -L. -ldep –ldl
./a.out
main sees duplicate as: m
main sees duplicate address as: 600ba0
dynamic sees duplicate from libdep as: d
dynamic sees duplicate address as: 5f4fb868
libdep sees duplicate as: m
libdep sees duplicate address as: 600ba0
but libdep sees duplicate from main as: m
See that the same variable has different addresses. And if we remove the RTLD_DEEPBIND from the main.c, the output is as expected.
main sees duplicate as: m
main sees duplicate address as: 600ba0
dynamic sees duplicate from libdep as: d
dynamic sees duplicate address as: 600ba0
libdep sees duplicate as: d
libdep sees duplicate address as: 600ba0
but libdep sees duplicate from main as: d
So My questions are:
When we have the need to use RTLD_DEEPBIND?
How come dynamic.so has different address of duplicate variable when it didn't even had the definition of variable d?
( I tried on gcc 4.2.2 and gcc 4.8.2)