.\" -*- coding: UTF-8 -*- .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH RTLD\-AUDIT 7 "17 مايو 2025" "صفحات دليل لينكس 6.18" .SH الاسم rtld\-audit \- واجهة برمجة تطبيقات التدقيق للرابط الديناميكي .SH موجز .nf \fB#define _GNU_SOURCE\fP /* See feature_test_macros(7) */ \fB#include \fP .fi .SH الوصف يوفر الرابط الديناميكي لجنو (رابط وقت التشغيل) واجهة برمجة تطبيقات تدقيق تسمح للتطبيق بالإشعار عند حدوث أحداث ربط ديناميكي مختلفة. تشبه واجهة برمجة التطبيقات هذه إلى حد كبير واجهة التدقيق التي يوفرها رابط وقت تشغيل Solaris. تُعرّف الثوابت والنماذج الأولية اللازمة بتضمين \fI\fP. .P لاستخدام هذه الواجهة، ينشئ المبرمج مكتبة مشتركة تطبق مجموعة قياسية من أسماء الدوال. لا يلزم تنفيذ جميع الدوال: في معظم الحالات، إذا لم يكن المبرمج مهتمًا بفئة معينة من أحداث التدقيق، فلا حاجة لتوفير تنفيذ لدالة التدقيق المقابلة. .P لاستخدام واجهة التدقيق، يجب تعريف متغير البيئة \fBLD_AUDIT\fP ليحتوي على قائمة مفصولة بنقطتين من المكتبات المشتركة، يمكن لكل منها تنفيذ (أجزاء من) واجهة برمجة تطبيقات التدقيق. عند حدوث حدث قابل للتدقيق، تُستدعى الدالة المقابلة في كل مكتبة، بالترتيب الذي تظهر به المكتبات. .SS la_version() \& .nf \fBunsigned int la_version(unsigned int \fP\fIversion\fP\fB);\fP .fi .P هذه هي الدالة الوحيدة التي \fIيجب\fP تعريفها بواسطة مكتبة التدقيق: تؤدي المصافحة الأولية بين الرابط الديناميكي ومكتبة التدقيق. عند استدعاء هذه الدالة، يمرر الرابط الديناميكي، في \fIversion\fP، أعلى إصدار من واجهة التدقيق التي يدعمها الرابط. .P يعيد التنفيذ النموذجي لهذه الدالة ببساطة الثابت \fBLAV_CURRENT\fP، الذي يشير إلى إصدار \fI\fP المستخدم لبناء وحدة التدقيق. إذا لم يدعم الرابط الديناميكي هذا الإصدار من واجهة التدقيق، سيرفض تفعيل وحدة التدقيق هذه. إذا أعادت الدالة صفرًا، لن يفعل الرابط الديناميكي أيضًا وحدة التدقيق هذه. .P لتمكين التوافق العكسي مع الروابط الديناميكية الأقدم، يمكن لوحدة التدقيق فحص وسيط \fIversion\fP وإعادة إصدار أقدم من \fBLAV_CURRENT\fP، بافتراض أن الوحدة يمكنها تعديل تنفيذها لمطابقة متطلبات الإصدار السابق من واجهة التدقيق. لا ينبغي لدالة \fBla_version\fP إعادة قيمة \fIversion\fP دون فحوصات إضافية لأنها قد تتوافق مع واجهة لا تطابق تعريفات \fI\fP المستخدمة لبناء وحدة التدقيق. .SS la_objsearch() \& .nf \fBchar *la_objsearch(const char *\fP\fIname\fP\fB, uintptr_t *\fP\fIcookie\fP\fB,\fP \fB unsigned int \fP\fIflag\fP\fB);\fP .fi .P يستدعي الرابط الديناميكي هذه الدالة لإعلام مكتبة التدقيق بأنه على وشك البحث عن كائن مشترك. وسيط \fIname\fP هو اسم الملف أو اسم المسار الذي سيُبحث عنه. يُعرّف \fIcookie\fP الكائن المشترك الذي بدأ البحث. يُضبط \fIflag\fP على إحدى القيم التالية: .TP 17 \fBLA_SER_ORIG\fP هذا هو الاسم الأصلي الذي يُبحث عنه. عادةً، يأتي هذا الاسم من إدخال ELF \fBDT_NEEDED\fP، أو هو وسيط \fIfilename\fP المعطى لـ \fBdlopen\fP(3). .TP \fBLA_SER_LIBPATH\fP \fIname\fP أُنشئ باستخدام دليل محدد في \fBLD_LIBRARY_PATH\fP. .TP \fBLA_SER_RUNPATH\fP \fIname\fP أُنشئ باستخدام دليل محدد في قائمة ELF \fBDT_RPATH\fP أو \fBDT_RUNPATH\fP. .TP \fBLA_SER_CONFIG\fP \fIname\fP وُجد عبر خبيئة \fBldconfig\fP(8) (\fI/etc/ld.so.cache\fP). .TP \fBLA_SER_DEFAULT\fP \fIname\fP وُجد عبر بحث في أحد الأدلة المبدئية. .TP \fBLA_SER_SECURE\fP \fIname\fP خاص بكائن آمن (غير مستخدم على لينكس). .P كنتيجة لدالتها، تُرجع \fBla_objsearch\fP() اسم المسار الذي ينبغي على الرابط الديناميكي استخدامه للمعالجة اللاحقة. إذا أُرجع NULL، يُتجاهل اسم المسار هذا للمعالجة اللاحقة. إذا كانت مكتبة التدقيق هذه تهدف ببساطة إلى مراقبة مسارات البحث، ينبغي إرجاع \fIname\fP. .SS la_activity() \& .nf \fBvoid la_activity( uintptr_t *\fP\fIcookie\fP\fB, unsigned int \fP\fIflag\fP\fB);\fP .fi .P يستدعي الرابط الديناميكي هذه الدالة لإعلام مكتبة التدقيق بأن نشاط خريطة الوصل يحدث. يُحدد \fIcookie\fP الكائن في رأس خريطة الوصل. عندما يستدعي الرابط الديناميكي هذه الدالة، يُضبط \fIflag\fP على إحدى القيم التالية: .TP 19 \fBLA_ACT_ADD\fP تُضاف كائنات جديدة إلى خريطة الوصل. .TP \fBLA_ACT_DELETE\fP تُزال كائنات من خريطة الوصل. .TP \fBLA_ACT_CONSISTENT\fP اكتمل نشاط خريطة الوصل: أصبحت الخريطة متسقة مرة أخرى. .SS la_objopen() \& .nf \fBunsigned int la_objopen(struct link_map *\fP\fImap\fP\fB, Lmid_t \fP\fIlmid\fP\fB,\fP \fB uintptr_t *\fP\fIcookie\fP\fB);\fP .fi .P يستدعي الرابط الديناميكي هذه الدالة عند تحميل كائن مشترك جديد. وسيطة \fImap\fP هي مؤشر لبنية خريطة وصل تصف الكائن. يحتوي حقل \fIlmid\fP على إحدى القيم التالية: .TP 17 \fBLM_ID_BASE\fP خريطة الوصل جزء من النطاق الأولي. .TP \fBLM_ID_NEWLM\fP خريطة الوصل جزء من نطاق جديد طُلب عبر \fBdlmopen\fP(3). .P \fIcookie\fP هو مؤشر لمعرّف لهذا الكائن. يُقدم المعرّف لاستدعاءات لاحقة لدوال في مكتبة التدقيق من أجل تحديد هذا الكائن. يُهيأ هذا المعرّف للإشارة إلى خريطة وصل الكائن، لكن يمكن لمكتبة التدقيق تغيير المعرّف إلى قيمة أخرى قد تفضلها لاستخدامها في تحديد الكائن. .P كقيمة إرجاعها، تُرجع \fBla_objopen\fP() قناع بتات يُنشأ بإجراء عملية OR على صفر أو أكثر من الثوابت التالية، والتي تسمح لمكتبة التدقيق باختيار الكائنات التي ستُراقب بواسطة \fBla_symbind*\fP(): .TP 17 \fBLA_FLG_BINDTO\fP تدقيق ارتباطات الرموز بهذا الكائن. .TP \fBLA_FLG_BINDFROM\fP تدقيق ارتباطات الرموز من هذا الكائن. .P قيمة إرجاع 0 من \fBla_objopen\fP() تشير إلى أنه لا ينبغي تدقيق أي ارتباطات رموز لهذا الكائن. .SS la_objclose() \& .nf \fBunsigned int la_objclose(uintptr_t *\fP\fIcookie\fP\fB);\fP .fi .P يستدعي الرابط الديناميكي هذه الدالة بعد تنفيذ أي كود إنهاء للكائن، قبل تفريغ الكائن. وسيطة \fIcookie\fP هي المعرّف الذي حُصل عليه من استدعاء سابق لـ \fBla_objopen\fP(). .P في التطبيق الحالي، يتم تجاهل القيمة التي يعيدها \fBla_objclose\fP(). .SS la_preinit() \& .nf \fBvoid la_preinit(uintptr_t *\fP\fIcookie\fP\fB);\fP .fi .P يستدعي الرابط الديناميكي هذه الدالة بعد تحميل جميع الكائنات المشتركة، قبل تمرير التحكم إلى التطبيق (أي قبل استدعاء \fImain\fP()). لاحظ أن \fImain\fP() قد لا يزال يقوم لاحقًا بتحميل الكائنات ديناميكيًا باستخدام \fBdlopen\fP(3). .SS la_symbind*() \& .nf \fBuintptr_t la_symbind32(Elf32_Sym *\fP\fIsym\fP\fB, unsigned int \fP\fIndx\fP\fB,\fP \fB uintptr_t *\fP\fIrefcook\fP\fB, uintptr_t *\fP\fIdefcook\fP\fB,\fP \fB unsigned int *\fP\fIflags\fP\fB, const char *\fP\fIsymname\fP\fB);\fP \fBuintptr_t la_symbind64(Elf64_Sym *\fP\fIsym\fP\fB, unsigned int \fP\fIndx\fP\fB,\fP \fB uintptr_t *\fP\fIrefcook\fP\fB, uintptr_t *\fP\fIdefcook\fP\fB,\fP \fB unsigned int *\fP\fIflags\fP\fB, const char *\fP\fIsymname\fP\fB);\fP .fi .P يستدعي الرابط الديناميكي إحدى هذه الدوال عند حدوث ربط رمز بين كائنين مشتركين تم وضع علامة عليهما لإشعار التدقيق بواسطة \fBla_objopen\fP(). تُستخدم الدالة \fBla_symbind32\fP() على المنصات 32\-بت؛ وتُستخدم الدالة \fBla_symbind64\fP() على المنصات 64\-بت. .P الوسيطة \fIsym\fP هي مؤشر إلى بنية توفر معلومات حول الرمز الذي يتم ربطه. يظهر تعريف البنية في \fI\fP. من بين حقول هذه البنية، يشير \fIst_value\fP إلى العنوان الذي يتم ربط الرمز به. .P تعطي الوسيطة \fIndx\fP فهرس الرمز في جدول الرموز للكائن المشترك المرتبط. .P تحدد الوسيطة \fIrefcook\fP الكائن المشترك الذي يقوم بمرجع الرمز؛ هذا هو نفس المعرف الذي يتم توفيره للدالة \fBla_objopen\fP() التي أعادت \fBLA_FLG_BINDFROM\fP. تحدد الوسيطة \fIdefcook\fP الكائن المشترك الذي يعرف الرمز المشار إليه؛ هذا هو نفس المعرف الذي يتم توفيره للدالة \fBla_objopen\fP() التي أعادت \fBLA_FLG_BINDTO\fP. .P تشير الوسيطة \fIsymname\fP إلى سلسلة تحتوي على اسم الرمز. .P .\" LA_SYMB_STRUCTCALL appears to be unused الوسيطة \fIflags\fP هي قناع بت يوفر معلومات حول الرمز ويمكن استخدامه لتعديل التدقيق الإضافي لهذا الإدخال في PLT (جدول ربط الإجراءات). قد يوفر الرابط الديناميكي قيم البت التالية في هذه الوسيطة: .TP 22 \fBLA_SYMB_DLSYM\fP نتج الربط عن استدعاء لـ \fBdlsym\fP(3). .TP \fBLA_SYMB_ALTVALUE\fP أعاد استدعاء سابق لـ \fBla_symbind*\fP() قيمة بديلة لهذا الرمز. .P .\" pltenter/pltexit are called for non-dynamically loaded libraries, .\" but don't seem to be called for dynamically loaded libs? .\" Is this the same on Solaris? افتراضيًا، إذا نفذت مكتبة التدقيق دالتي \fBla_pltenter\fP() و \fBla_pltexit\fP() (انظر أدناه)، فسيتم استدعاء هذه الدوال، بعد \fBla_symbind\fP()، لإدخالات PLT، في كل مرة يتم فيها مرجع الرمز. يمكن إجراء عملية OR للأعلام التالية في \fI*flags\fP لتغيير هذا السلوك الافتراضي: .TP 22 \fBLA_SYMB_NOPLTENTER\fP لا تستدع \fBla_pltenter\fP() لهذا الرمز. .TP 22 \fBLA_SYMB_NOPLTEXIT\fP لا تستدع \fBla_pltexit\fP() لهذا الرمز. .P قيمة الإرجاع لـ \fBla_symbind32\fP() و \fBla_symbind64\fP() هي العنوان الذي يجب تمرير التحكم إليه بعد إرجاع الدالة. إذا كانت مكتبة التدقيق تراقب ببساطة ربط الرموز، فيجب أن تعيد \fIsym\->st_value\fP. قد يتم إرجاع قيمة مختلفة إذا رغبت المكتبة في توجيه التحكم إلى موقع بديل. .SS la_pltenter() يعتمد الاسم الدقيق وأنواع الوسائط لهذه الدالة على منصة العتاد. (يتم توفير التعريف المناسب بواسطة \fI\fP.) إليك التعريف لـ x86\-32: .P .nf \fBElf32_Addr la_i86_gnu_pltenter(Elf32_Sym *\fP\fIsym\fP\fB, unsigned int \fP\fIndx\fP\fB,\fP \fB uintptr_t *\fP\fIrefcook\fP\fB, uintptr_t *\fP\fIdefcook\fP\fB,\fP \fB La_i86_regs *\fP\fIregs\fP\fB, unsigned int *\fP\fIflags\fP\fB,\fP \fB const char *\fP\fIsymname\fP\fB, long *\fP\fIframesizep\fP\fB);\fP .fi .P تُستدعى هذه الدالة قبل استدعاء مدخل PLT مباشرة، بين كائنين مشتركين تم وضع علامة عليهما لإشعار الربط. .P \fIsym\fP و \fIndx\fP و \fIrefcook\fP و \fIdefcook\fP و \fIsymname\fP هي كما في \fBla_symbind*\fP(). .P يشير وسيط \fIregs\fP إلى بنية (مُعرّفة في \fI\fP) تحتوي على قيم السجلات المستخدمة لاستدعاء مدخل PLT هذا. .P يشير وسيط \fIflags\fP إلى قناع بت ينقل معلومات حول مدخل PLT هذا، ويمكن استخدامه لتعديل التدقيق اللاحق له، كما في \fBla_symbind*\fP(). .P .\" FIXME . Is the following correct? يشير وسيط \fIframesizep\fP إلى مخبأ \fIlong\ int\fP يمكن استخدامه لتعيين حجم الإطار المستخدم لاستدعاء مدخل PLT هذا بشكل صريح. إذا أعادت استدعاءات مختلفة لـ \fBla_pltenter\fP() لهذا الرمز قيماً مختلفة، فتُستخدم القيمة القصوى المُعادة. تُستدعى دالة \fBla_pltexit\fP() فقط إذا تم تعيين هذا المخبأ بشكل صريح إلى قيمة مناسبة. .P قيمة إرجاع \fBla_pltenter\fP() هي كما في \fBla_symbind*\fP(). .SS la_pltexit() يعتمد الاسم الدقيق وأنواع الوسائط لهذه الدالة على منصة العتاد. (يتم توفير التعريف المناسب بواسطة \fI\fP.) إليك التعريف لـ x86\-32: .P .nf \fBunsigned int la_i86_gnu_pltexit(Elf32_Sym *\fP\fIsym\fP\fB, unsigned int \fP\fIndx\fP\fB,\fP \fB uintptr_t *\fP\fIrefcook\fP\fB, uintptr_t *\fP\fIdefcook\fP\fB,\fP \fB const La_i86_regs *\fP\fIinregs\fP\fB, La_i86_retval *\fP\fIoutregs\fP\fB,\fP \fB const char *\fP\fIsymname\fP\fB);\fP .fi .P تُستدعى هذه الدالة عندما يعود مدخل PLT، الذي أُنشئ بين كائنين مشتركين تم وضع علامة عليهما لإشعار الربط. تُستدعى الدالة قبل عودة التحكم إلى مستدعي مدخل PLT مباشرة. .P \fIsym\fP و \fIndx\fP و \fIrefcook\fP و \fIdefcook\fP و \fIsymname\fP هي كما في \fBla_symbind*\fP(). .P يشير وسيط \fIinregs\fP إلى بنية (مُعرّفة في \fI\fP) تحتوي على قيم السجلات المستخدمة لاستدعاء مدخل PLT هذا. يشير وسيط \fIoutregs\fP إلى بنية (مُعرّفة في \fI\fP) تحتوي على قيم الإرجاع لاستدعاء مدخل PLT هذا. يمكن للمستدعي تعديل هذه القيم، وستكون التغييرات مرئية لمستدعي مدخل PLT. .P .\" This differs from Solaris, where an audit library that monitors .\" symbol binding should return the value of the 'retval' argument .\" (not provided by GNU, but equivalent to returning outregs->lrv_eax .\" on (say) x86-32). في التطبيق الحالي لـ GNU، يتم تجاهل قيمة إرجاع \fBla_pltexit\fP(). .SH الإصدارات تشبه واجهة API هذه إلى حد كبير واجهة Solaris API الموصوفة في دليل Solaris \fILinker and Libraries Guide\fP، في الفصل \fIRuntime Linker Auditing Interface\fP. .SH المعايير لا يوجد. .SH ملاحظات لاحظ الاختلافات التالية عن واجهة API لتدقيق الرابط الديناميكي في Solaris: .IP \[bu] 3 واجهة Solaris \fBla_objfilter\fP() غير مدعومة في تطبيق GNU. .IP \[bu] دالتا Solaris \fBla_symbind32\fP() و \fBla_pltexit\fP() لا توفران وسيط \fIsymname\fP. .IP \[bu] دالة Solaris \fBla_pltexit\fP() لا توفر وسيطي \fIinregs\fP و \fIoutregs\fP (لكنها توفر وسيط \fIretval\fP مع قيمة إرجاع الدالة). .SH العلل .\" FIXME . Specifying multiple audit libraries doesn't work on GNU. .\" My simple tests on Solaris work okay, but not on Linux -- mtk, Jan 2009 .\" glibc bug filed: http://sourceware.org/bugzilla/show_bug.cgi?id=9733 .\" Reportedly, this is fixed on 16 Mar 2009 (i.e., for glibc 2.10) في إصدارات glibc حتى 2.9، يؤدي تحديد أكثر من مكتبة تدقيق في \fBLD_AUDIT\fP إلى تعطل وقت التشغيل. يُقال إن هذا أُصلح في glibc 2.10. .SH أمثلة .EX #include #include \& unsigned int la_version(unsigned int version) { printf("la_version(): version = %u; LAV_CURRENT = %u\[rs]n", version, LAV_CURRENT); \& return LAV_CURRENT; } \& char * la_objsearch(const char *name, uintptr_t *cookie, unsigned int flag) { printf("la_objsearch(): name = %s; cookie = %p", name, cookie); printf("; flag = %s\[rs]n", (flag == LA_SER_ORIG) ? "LA_SER_ORIG" : (flag == LA_SER_LIBPATH) ? "LA_SER_LIBPATH" : (flag == LA_SER_RUNPATH) ? "LA_SER_RUNPATH" : (flag == LA_SER_DEFAULT) ? "LA_SER_DEFAULT" : (flag == LA_SER_CONFIG) ? "LA_SER_CONFIG" : (flag == LA_SER_SECURE) ? "LA_SER_SECURE" : "???"); \& return name; } \& void la_activity (uintptr_t *cookie, unsigned int flag) { printf("la_activity(): cookie = %p; flag = %s\[rs]n", cookie, (flag == LA_ACT_CONSISTENT) ? "LA_ACT_CONSISTENT" : (flag == LA_ACT_ADD) ? "LA_ACT_ADD" : (flag == LA_ACT_DELETE) ? "LA_ACT_DELETE" : "???"); } \& unsigned int la_objopen(struct link_map *map, Lmid_t lmid, uintptr_t *cookie) { printf("la_objopen(): loading \[rs]"%s\[rs]"; lmid = %s; cookie=%p\[rs]n", map\->l_name, (lmid == LM_ID_BASE) ? "LM_ID_BASE" : (lmid == LM_ID_NEWLM) ? "LM_ID_NEWLM" : "???", cookie); \& return LA_FLG_BINDTO | LA_FLG_BINDFROM; } \& unsigned int la_objclose (uintptr_t *cookie) { printf("la_objclose(): %p\[rs]n", cookie); \& return 0; } \& void la_preinit(uintptr_t *cookie) { printf("la_preinit(): %p\[rs]n", cookie); } \& uintptr_t la_symbind32(Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook, uintptr_t *defcook, unsigned int *flags, const char *symname) { printf("la_symbind32(): symname = %s; sym\->st_value = %p\[rs]n", symname, sym\->st_value); printf(" ndx = %u; flags = %#x", ndx, *flags); printf("; refcook = %p; defcook = %p\[rs]n", refcook, defcook); \& return sym\->st_value; } \& uintptr_t la_symbind64(Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook, uintptr_t *defcook, unsigned int *flags, const char *symname) { printf("la_symbind64(): symname = %s; sym\->st_value = %p\[rs]n", symname, sym\->st_value); printf(" ndx = %u; flags = %#x", ndx, *flags); printf("; refcook = %p; defcook = %p\[rs]n", refcook, defcook); \& return sym\->st_value; } \& Elf32_Addr la_i86_gnu_pltenter(Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook, uintptr_t *defcook, La_i86_regs *regs, unsigned int *flags, const char *symname, long *framesizep) { printf("la_i86_gnu_pltenter(): %s (%p)\[rs]n", symname, sym\->st_value); \& return sym\->st_value; } .EE .SH "انظر أيضًا" \fBldd\fP(1), \fBdlopen\fP(3), \fBld.so\fP(8), \fBldconfig\fP(8) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .