دليل أمر ar في لينكس: إنشاء المكتبات الساكنة .a

مدخل إلى إدارة الأرشيفات البرمجية

تعتمد بيئات تطوير C و C++ في نظام لينكس على المكتبات الساكنة ذات الامتداد (.a) لتجميع الشيفرات الثنائية المترجمة مسبقاً وتسهيل إعادة استخدامها. تشكّل أداة ar الركيزة الأساسية لحزم ملفات الكائنات الثنائية وفهرستها وصيانتها. يستعرض هذا الدليل خطوات إنشاء الأرشيف الثابت من الصفر، وآليات استخراج وحذف الملفات منه، إضافة إلى إدارة فهارس الرموز بواسطة ranlib وتجنب الأخطاء الشائعة أثناء مرحلة الربط (Linking).

تجهيز بيئة العمل وبناء ملفات الكائنات (.o)

قبل الشروع في تجميع الأرشيف، يلزم توفير حزمة أدوات النظم الأساسية ومترجم لغة C عبر تنفيذ الأمر التالي لتثبيت binutils ومترجم gcc:

apt-get update -qq && apt-get install -y binutils gcc

لعزل ملفات التجربة وضمان تنظيم مسار العمل، ننشئ دليلاً تجريبياً مخصصاً ثم ننتقل إليه مباشرة:

mkdir -p /tmp/ar_demo && cd /tmp/ar_demo

نقوم بصياغة دالة حسابية بسيطة لعملية الجمع داخل ملف مصدري بلغة C باسم math_add.c:

echo ‘int add(int a, int b) { return a + b; }’ > math_add.c

وبالمثل، نكتب دالة مخصصة لعملية الطرح ونحفظها في ملف مصدري مستقل باسم math_sub.c:

echo ‘int sub(int a, int b) { return a - b; }’ > math_sub.c

نقوم بتحويل الملفات المصدرية المكتوبة إلى ملفات كائنات ثنائية قابلة للتجميع دون استدعاء مرحلة الربط النهائي عبر تمرير خيار -c إلى مترجم gcc:

gcc -c math_add.c math_sub.c

للتحقق من اكتمال الترجمة وتوليد ملفي math_add.o و math_sub.o بنجاح داخل المجلد، نستعرض قائمة الملفات الثنائية:

ls -l *.o

تجميع الأرشيف الساكن (.a) وإدراج الملفات عبر (ar rcs)

لضمان تنفيذ العمليات داخل النطاق الصحيح، نتأكد من التواجد ضمن مسار العمل المخصص:

cd /tmp/ar_demo

نجمع الآن ملفات الكائنات داخل مكتبة ساكنة موحدة تحمل الاسم libmath.a مع توليد جدول الرموز البرمجية من خلال تنفيذ الأمر التالي:

ar rcs libmath.a math_add.o math_sub.o

تتكامل وظائف وسائط التشغيل المستخدمة هنا كالآتي:

  • r: إدراج ملفات الكائنات داخل الأرشيف أو استبدال النسخ القديمة منها.
  • c: إنشاء ملف الأرشيف الجديد دون إظهار تنبيهات تفيد بعدم وجوده مسبقاً.
  • s: بناء وتحديث فهرس الرموز الداخلية لتسريع وصول أداة الربط إلى الدوال.

للاطلاع على الحجم الإجمالي للمكتبة المولدة والتأكد من خصائص تصاريحها، نستعرض تفاصيل الملف بصيغة واضحة للقراءة:

ls -lh libmath.a

فحص محتويات الأرشيف واستعراض جدول الرموز (ar t, nm)

نبدأ أولاً بالتحقق من مسار العمل الحالي والانتقال إلى مجلد المشروع:

cd /tmp/ar_demo

لقراءة البيانات الوصفية للملفات المدمجة داخل libmath.a ومعرفة أصحابها وتواريخ تعديلها وأحجامها الفردية، نستخدم المعاملين t و v:

ar tv libmath.a

يعمل الحرف t على سرد أعضاء الأرشيف، بينما يتيح v وضع الإخراج المفصل (Verbose) لعرض البيانات المترية بدقة.

وللتأكد من صحة تعريف الدوال والرموز المضمنة داخل كل ملف كائن وإمكانية تصديرها لمرحلة الربط، نستعين بالأداة nm مع تمرير خيار الفهرسة -s:

nm -s libmath.a

يكشف هذا الإجراء عن خريطة جدول الرموز، مما يضمن احتواء الأرشيف على مدخلات صالحة لدالتي add و sub.

استخراج كائنات محددة وحذفها من الأرشيف (ar x, ar d)

عند الحاجة إلى تفكيك المكتبة أو سحب ملف كائن مفرد لمعاينته، نؤسس دليلاً فرعياً لعزل عمليات الاستخراج:

cd /tmp/ar_demo && mkdir -p extracted

ننتقل إلى المجلد المستحدث ثم نستخرج الملف الثنائي math_add.o بمفرده من داخل الأرشيف الرئيسي عبر استخدام خيار x:

cd extracted && ar x ../libmath.a math_add.o && ls -l

بعد معاينة الملف المستخرج، نعود مباشرة إلى مجلد العمل الأساسي لمتابعة إدارة المكتبة:

cd /tmp/ar_demo

في حال تقرر الاستغناء عن وحدة برمجية معينة، يتيح المعامل d استبعاد ملف الكائن المستهدف نهائياً من الأرشيف؛ هنا نحذف math_sub.o:

ar d libmath.a math_sub.o

نتحقق مجدداً من بنية المكتبة للتأكد من انحسار محتواها على math_add.o فقط واختفاء الملف المحذوف:

ar t libmath.a

محاذير تقنية: فهرسة الرموز وتفادي أخطاء مرحلة الربط

نرجع أولاً إلى مجلد الاختبار لمتابعة سيناريو تحديث المكتبات ومزامنة فهارسها:

cd /tmp/ar_demo

إذا أعدنا إدراج math_sub.o في الأرشيف باستخدام المعامل r المجرد دون تضمين الخيار s، فلن يُعاد بناء فهرس الرموز تلقائياً:

ar r libmath.a math_sub.o

يؤدي إغفال تحديث جدول الرموز إلى إخفاق أداة الربط لاحقاً في العثور على الدوال المضافة، مما يولد أخطاء من نوع undefined reference.

ولمعالجة هذا الخلل وتحديث جدول الرموز يدوياً للأرشيف القائم، نطبق أمر ranlib:

ranlib libmath.a

تُعيد هذه الخطوة تنظيم ترويسة الأرشيف وتحديث الفهرس الثنائي ليصبح متوافقاً بالكامل مع متطلبات الروابط الثابتة.

للتثبت من نجاح الفهرسة واستعادة الربط لكافة الدوال بعد المعالجة، ننفذ أداة الفحص nm -s:

nm -s libmath.a

يوضح المخرج عودة ظهور دالتي add و sub ضمن جدول الرموز المركزي للأرشيف، مما يضمن جاهزية المكتبة للربط البرمجي السليم دون معوقات.