मैंने कोड का एक टुकड़ा बनाया जिसमें एक गतिशील पुस्तकालय (lib.c
), और एक मुख्य निष्पादन योग्य (main.c
) शामिल है। दोनों फाइलों में मैं एक वैश्विक चर नामित करता हूं: int global
। बहुत स्मार्ट नहीं है लेकिन यह सवाल नहीं है।वैश्विक चर, साझा पुस्तकालय और -एफपीआईसी प्रभाव
जब मैं गतिशील पुस्तकालय संकलन -fPIC
विकल्प अनिवार्य लगता है:
gcc lib.c -fPIC -shared -o lib.so
अन्यथा मैं:
/usr/bin/ld: /tmp/ccpUvIPj.o: relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
जब मैं निष्पादन योग्य संकलन ऐसा नहीं है।
gcc main.c -fPIC -ldl
gcc main.c -ldl
दोनों काम, लेकिन अलग-अलग व्यवहार हैं जिन्हें मैं समझा नहीं सकता, क्या आप? :
global main: 23 (0x601050)
global lib: 23 (0x601050)
-fPIC बिना
, lib.c में वैश्विक main.c में वैश्विक सहसंबद्ध नहीं है:
-fPIC, main.c में वैश्विक और lib.c में वैश्विक साथएक ही चर हैं :
global main: 23 (0x601048)
global lib: 0 (0x7f7742e64028)
यहाँ स्रोत है:
lib.c
#include <stdio.h>
#include <stdlib.h>
int global;
int f_one() {
printf("global lib: %d (%p)\n", global, &global);
return EXIT_SUCCESS;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
void * handle;
int global;
int main() {
int q = 7;
int (* f_one_p)(int a) = NULL;
global = 23;
handle = dlopen("./lib.so", RTLD_NOW);
if (handle == 0) {
return EXIT_FAILURE;
}
f_one_p = dlsym(handle, "f_one");
printf("global main: %d (%p)\n", global, &global);
f_one_p(q);
return EXIT_SUCCESS;
}
जीसीसी --version: जीसीसी (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
uname -एक: लिनक्स xxx 2.6.38-11-जेनेरिक # 48-उबंटू SMP शुक्र जुला 29 19:02:55 यूटीसी 2011 x86_64 x86_64 x86_64 जीएनयू/लिनक्स
संपादित: कोड रवि/SPARC के तहत परीक्षण किया है और अप्रत्याशित साझा वैश्विक चर का एक ही प्रकार के साथ 86/लिनक्स आर्किटेक्चर (साथ -fPIC)।
संबंधित: http://stackoverflow.com/q/7216244/168175 – Flexo