استخدام المكتبات على حد سواء ثابتة ومرتبطة بشكل حيوي في دول مجلس التعاون الخليجي

StackOverflow https://stackoverflow.com/questions/809794

  •  03-07-2019
  •  | 
  •  

سؤال

وأحتاج لتوزيع ثنائي من شأنها أن تعمل على العديد من توزيعات لينكس إلى x86 ممكن. وهذا يعني أنه لا بد لي من ربط ثابت بعض المكتبات، مثل سي العمومية، لأن المستخدم قد لا يكون النسخة يمكنني استخدام. المكتبات الأخرى يجب أن تكون مرتبطة بشكل حيوي، مثل fontconfig، لأنها تعتمد على تنسيق ملف ذاكرة التخزين المؤقت والثابت ترميز المواقع التي قد تختلف على كل نظام.

ما هي خيارات سطر الأوامر للقيام بذلك؟ إذا كنت تحديد -static، ثم دول مجلس التعاون الخليجي سوف يرفضون ربط أي مكتبات حيوي على الإطلاق.

هل كانت مفيدة؟

المحلول

وربط ثابت ضد أي مكتبة النظام، وخصوصا ضد libc، على أنظمة UNIX أو لينكس الحديثة يجعل ثنائي كبير <م> أقل المحمولة. فقط لا تفعل ذلك.

وبدلا من ذلك، استخدم التوافق (لا تزال الثنائيات مرتبطة على النظام القديم ليعمل على جميع أحدث منها) لصالحك، إما عن طريق ربط ثنائي الخاص بك على النظام القديم (I استخدام ريدهات 6.2، وأنا لم أر نظام لينكس حيث لن يتم تشغيل بلدي ثنائي في السنوات ال 8 الماضية)، أو باستخدام شيء من هذا القبيل <لأ href = "https://web.archive.org/web/20100613022915/http://autopackage.org/apbuild-apgcc.php "يختلط =" noreferrer "> autopackage (والتي قد تم حذفه بعد كتابة هذه الإجابة).

لإجابة على سؤالك الأصلي:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

وسوف يسبب رابط لاستخدام النسخة أرشيف من libfoo. [ومن المهم أن يكون -Wl,-Bdynamic زائدة على وجه التحديد لذلك كنت لا قوة LIBC ثابت.]

نصائح أخرى

وتجدر الإشارة إلى أنه وفقا لينكس، يمكنك فقط (بأمان) ربط بشكل ثابت مكتبة إذا كان أي من المكتبات الديناميكية تعتمد على ذلك. وهذا يعني أنه إذا كنت تستخدم أي مكتبات ديناميكية على الإطلاق، يمكنك نسيان ثابت ربط LIBC. مجرد استخدام النسخة القديمة إلى حد ما بناء على لحالة LIBC؛ و حافظت LIBC قوي ABI الوراء التوافق على مر السنين.

وحاول تمرير في مسارات الملفات المكتبة التي تقوم بربط ضد على سطر الأوامر رابط (سواء كانت .a أو. لذا المكتبات) وإسقاط -static. وينبغي أن تفعل خدعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top