6.21.1. تركيب دول مجلس التعاون الخليجي
في حالة البناء على x86_64 ، قم بتغيير اسم الدليل الافتراضي لمكتبات 64 بت إلى "lib":
حالة $ (uname -m) في x86_64)
sed -e '/ m64 = / s / lib64 / lib /' \
-i.orig gcc / config / i386 / t-linux64
;;
ESAC
حالة $ (uname -m) في x86_64)
sed -e '/ m64 = / s / lib64 / lib /' \
-i.orig gcc / config / i386 / t-linux64
;;
ESAC
توصي وثائق دول مجلس التعاون الخليجي ببناء دول مجلس التعاون الخليجي في دليل بناء مخصص:
mkdir -v بناء قرص مضغوط
mkdir -v بناء قرص مضغوط
تحضير دول مجلس التعاون الخليجي للتجميع:
سيد = سيد \
../configure --refix = / usr \
- لغات قابلة للتمكين = c، c ++ \
--تعطيل multilib \
--تعطيل التمهيد \
- مع نظام- zlib
سيد = سيد \
../configure --refix = / usr \
- لغات قابلة للتمكين = c، c ++ \
--تعطيل multilib \
--تعطيل التمهيد \
- مع نظام- zlib
لاحظ أنه بالنسبة للغات الأخرى ، هناك بعض المتطلبات الأساسية التي لم تتوفر بعد. راجع كتاب BLFS للحصول على إرشادات حول كيفية بناء جميع اللغات المدعومة في دول مجلس التعاون الخليجي.
معنى معلمات التكوين الجديدة:
سيد = سيد
يؤدي تعيين متغير البيئة هذا إلى منع المسار ذي الترميز الثابت إلى / tools / bin / sed.
- مع نظام- zlib
يخبر هذا المفتاح GCC بالارتباط بالنظام المثبت بنسخة من مكتبة Zlib ، بدلاً من نسختها الداخلية.

تجميع الحزمة:
جعل
جعل
مهم
في هذا القسم ، تعتبر مجموعة الاختبارات لدول مجلس التعاون الخليجي بالغة الأهمية. لا تخطيه تحت أي ظرف من الظروف.
مهم
في هذا القسم ، تعتبر مجموعة الاختبارات لدول مجلس التعاون الخليجي بالغة الأهمية. لا تخطيه تحت أي ظرف من الظروف.
من المعروف أن مجموعة واحدة من الاختبارات في مجموعة اختبار GCC تستنفد المكدس ، لذا قم بزيادة حجم المكدس قبل تشغيل الاختبارات:
علي عبدالله علي 32768
علي عبدالله علي 32768
اختبر النتائج كمستخدم لا يتمتع بامتيازات ، ولكن لا تتوقف عند الأخطاء:
chown -Rv لا أحد.
su nobody -s / bin / bash -c "PATH = $ PATH make -k check"
chown -Rv لا أحد.
su nobody -s / bin / bash -c "PATH = $ PATH make -k check"
لتلقي ملخص لنتائج مجموعة الاختبار ، قم بتشغيل:
../contrib/test_summary
../contrib/test_summary
للملخصات فقط ، قم بتمرير الإخراج من خلال grep -A7 مجموع.
يمكن مقارنة النتائج مع تلك الموجودة على http://www.linuxfromscratch.org/lfs/build-logs/9.0/ و https: //gcc.gnu. org / ml / gcc-testresults /.
من المعروف فشل ستة اختبارات متعلقة بـ get_time. يبدو أن هذه مرتبطة بالإعدادات المحلية en_HK.
من المعروف أن اختبارين باسم lookup.cc و reverse.cc في التجريبية / net يفشلان في بيئة chroot LFS لأنهما يتطلبان / etc / hosts و iana-etc.
من المعروف فشل اختبارين باسم pr57193.c و pr90178.c.
لا يمكن دائمًا تجنب بعض حالات الفشل غير المتوقعة. عادة ما يكون مطورو دول مجلس التعاون الخليجي على دراية بهذه المشكلات ، لكنهم لم يحلوها بعد. ما لم تكن نتائج الاختبار مختلفة تمامًا عن تلك الموجودة على عنوان URL أعلاه ، فمن الآمن المتابعة.
قم بتثبيت الحزمة وإزالة الدليل غير الضروري:
جعل تثبيت
rm -rf / usr / lib / gcc / $ (gcc -dumpmachine) /9.2.0/include-fixed/bits/
جعل تثبيت
rm -rf / usr / lib / gcc / $ (gcc -dumpmachine) /9.2.0/include-fixed/bits/
دليل إنشاء مجلس التعاون الخليجي مملوك لـ لا أحد الآن وستكون ملكية دليل الرأس المثبت (ومحتوياته) غير صحيحة. قم بتغيير الملكية إلى جذر المستخدم والمجموعة:
chown -v -R root: root \
/usr/lib/gcc/*linux-gnu/9.2.0/include{،-fixed}
chown -v -R root: root \
/usr/lib/gcc/*linux-gnu/9.2.0/include{،-fixed}
قم بإنشاء ارتباط رمزي مطلوب من قبل FHS لأسباب "تاريخية".
ln -sv ../usr/bin/cpp / lib
ln -sv ../usr/bin/cpp / lib
العديد من الحزم تستخدم الاسم cc لاستدعاء مترجم لغة سي. لتلبية هذه الحزم ، قم بإنشاء ارتباط رمزي:
ln -sv gcc / usr / bin / cc
ln -sv gcc / usr / bin / cc
أضف ارتباط رمزي للتوافق لتمكين إنشاء البرامج باستخدام Link Time Optimization (LTO):
تثبيت -v -dm755 / usr / lib / bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine) /9.2.0/liblto_plugin.so \
/ usr / lib / bfd-plugins /
تثبيت -v -dm755 / usr / lib / bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine) /9.2.0/liblto_plugin.so \
/ usr / lib / bfd-plugins /
الآن بعد أن أصبحت سلسلة الأدوات النهائية في مكانها الصحيح ، من المهم التأكد مرة أخرى من أن التجميع والربط سيعملان كما هو متوقع. نقوم بذلك عن طريق إجراء نفس فحوصات السلامة كما فعلنا سابقًا في الفصل:
صدى 'int main () {}'> dummy.c
cc dummy.c -v -Wl، - مطول &> dummy.log readelf -l a.out | grep ': / lib'
صدى 'int main () {}'> dummy.c
cc dummy.c -v -Wl، - مطول &> dummy.log readelf -l a.out | grep ': / lib'
يجب ألا تكون هناك أخطاء ، وسيكون ناتج الأمر الأخير (السماح بالاختلافات الخاصة بالنظام الأساسي في اسم الرابط الديناميكي):
[طلب مترجم البرنامج: /lib64/ld-linux-x86-64.so.2]
[طلب مترجم البرنامج: /lib64/ld-linux-x86-64.so.2]
تأكد الآن من إعدادنا لاستخدام ملفات البدء الصحيحة:
grep -o '/usr/lib.*/crt[1in].* نجح' dummy.log
grep -o '/usr/lib.*/crt[1in].* نجح' dummy.log
يجب أن يكون إخراج الأمر الأخير:
نجح /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crt1.o
نجح /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o نجح
نجح /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crt1.o
نجح /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o نجح
اعتمادًا على بنية جهازك ، قد يختلف ما سبق قليلاً ، وعادةً ما يكون الاختلاف هو اسم الدليل بعده / usr / lib / gcc. الشيء المهم الذي يجب البحث عنه هنا هو ذلك دول مجلس التعاون الخليجي وجد الثلاثة crt * .o الملفات الموجودة بامتداد / البيرة / ليب الدليل.
تحقق من أن المترجم يبحث عن ملفات الرأس الصحيحة:
grep -B4 '^ / usr / include' dummy.log
grep -B4 '^ / usr / include' dummy.log
يجب أن يُرجع هذا الأمر الإخراج التالي:
# تضمين <...> يبدأ البحث هنا:
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include
/ usr / local / include
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed
/ البيرة / تتضمن
# تضمين <...> يبدأ البحث هنا:
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include
/ usr / local / include
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed
/ البيرة / تتضمن
مرة أخرى ، لاحظ أن الدليل المسمى على اسم الثلاثي المستهدف الخاص بك قد يكون مختلفًا عما سبق ، اعتمادًا على البنية الخاصة بك.
بعد ذلك ، تحقق من استخدام الرابط الجديد مع مسارات البحث الصحيحة:
grep 'SEARCH. * / usr / lib' dummy.log | sed 's | ؛ | \ n | ز '
grep 'SEARCH. * / usr / lib' dummy.log | sed 's | ؛ | \ n | ز '
يجب تجاهل الإشارات إلى المسارات التي تحتوي على مكونات مع "-linux-gnu" ، ولكن بخلاف ذلك ، يجب أن يكون إخراج الأمر الأخير:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64") SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64")
SEARCH_DIR ("/ usr / lib64") SEARCH_DIR ("/ usr / x86_64-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib") ؛
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64") SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64")
SEARCH_DIR ("/ usr / lib64") SEARCH_DIR ("/ usr / x86_64-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib") ؛
قد يرى نظام 32 بت بعض الدلائل المختلفة. على سبيل المثال ، هذا هو الإخراج من جهاز i686:
SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib32") SEARCH_DIR ("/ usr / local / lib32") SEARCH_DIR ("/ lib32")
SEARCH_DIR ("/ usr / lib32") SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib") ؛
SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib32") SEARCH_DIR ("/ usr / local / lib32") SEARCH_DIR ("/ lib32")
SEARCH_DIR ("/ usr / lib32") SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib") ؛
بعد ذلك ، تأكد من أننا نستخدم libc الصحيح:
grep "/lib.*/libc.so.6" dummy.log
grep "/lib.*/libc.so.6" dummy.log
يجب أن يكون إخراج الأمر الأخير:
نجحت محاولة فتح /lib/libc.so.6
نجحت محاولة فتح /lib/libc.so.6
أخيرًا ، تأكد من أن GCC يستخدم الرابط الديناميكي الصحيح:
وجد grep dummy.log
وجد grep dummy.log
يجب أن يكون إخراج الأمر الأخير (السماح بالاختلافات الخاصة بالنظام الأساسي في اسم الرابط الديناميكي):
وجدت ld-linux-x86-64.so.2 في /lib/ld-linux-x86-64.so.2
وجدت ld-linux-x86-64.so.2 في /lib/ld-linux-x86-64.so.2
إذا لم يظهر الناتج كما هو موضح أعلاه أو لم يتم استلامه على الإطلاق ، فهذا يعني أن هناك شيئًا خاطئًا بشكل خطير. تحقق من الخطوات وتتبعها لمعرفة مكان المشكلة وتصحيحها. السبب الأكثر ترجيحًا هو حدوث خطأ ما في تعديل ملف المواصفات. يجب حل أي مشاكل قبل متابعة العملية.
بمجرد أن يعمل كل شيء بشكل صحيح ، قم بتنظيف ملفات الاختبار:
rm -v dummy.c a.out dummy.log
rm -v dummy.c a.out dummy.log
أخيرًا ، انقل ملفًا في غير محله:
mkdir -pv / usr / share / gdb / auto-load / usr / lib
mv -v /usr/lib/*gdb.py / usr / share / gdb / auto-load / usr / lib
mkdir -pv / usr / share / gdb / auto-load / usr / lib
mv -v /usr/lib/*gdb.py / usr / share / gdb / auto-load / usr / lib
توثيق