Avatar ·

ما هو العلم -fPIC في GCC ولماذا هو ضروري عند بناء المكتبات؟

مرحبًا بالجميع! بدأت في تعلم C++ وأحاول بناء مكتبة ديناميكية (.so) على Linux باستخدام GCC. أرى في كل مكان أنه عند ترجمة الكائنات للمكتبة يضيفون العلم -fPIC، لكنني لا أفهم لماذا هو ضروري. إليك مثال بسيط خاص بي. يوجد ملف `math_utils.cpp`: ```cpp int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } ``` أقوم بالترجمة هكذا: ```bash g++ -c math_utils.cpp -o math_utils.o g++ -shared math_utils.o -o libmath.so ``` وكل شيء يعمل! يتم إنشاء المكتبة، ويقوم البرنامج بتوصيلها واستخدام الدوال. ولكن إذا أضفت -fPIC: ```bash g++ -c -fPIC math_utils.cpp -o math_utils.o ``` النتيجة نفسها. ما الفرق؟ عندما بحثت في Google، كتبوا أنه بدون -fPIC على x86_64 قد يحدث خطأ، لكن لدي كل شيء يُترجم. اشرح لي، من فضلك، ما هو Position Independent Code، وهل من الضروري استخدام -fPIC للمكتبات المشتركة (shared libraries)؟ هل هناك حالات لا يمكن الاستغناء عنها بدونه؟ شكرًا مقدمًا!