الاسم
- Provided by: manpages-ar-dev (Version: 4.31.0-1)
- Source: manpages-l10n
- Report a bug
مكتبة الربط الديناميكي (libdl، -ldl)
#define _GNU_SOURCE #include <dlfcn.h>
int dladdr(const void *addr, Dl_info *info);
int dladdr1(const void *addr, Dl_info *info, void **extra_info,
int flags);
تحدد الدالة dladdr() ما إذا كان العنوان المحدد في addr موجودًا في أحد الكائنات المشتركة المحملة بواسطة التطبيق المستدعي. إذا كان الأمر كذلك، فتُرجع dladdr() معلومات حول الكائن المشترك والرمز الذي يتداخل مع addr. تُرجع هذه المعلومات في بنية Dl_info:
typedef struct {
const char *dli_fname; /* اسم مسار الكائن المشترك الذي
يحتوي على العنوان */
void *dli_fbase; /* العنوان الأساسي الذي يُحمل عنده
الكائن المشترك */
const char *dli_sname; /* اسم الرمز الذي يتداخل تعريفه
مع addr */
void *dli_saddr; /* العنوان الدقيق للرمز المسمى
في dli_sname */
} Dl_info;
إذا لم يُعثر على رمز مطابق لـ addr، فتُضبط dli_sname و dli_saddr على NULL.
الدالة dladdr1() تشبه dladdr()، لكنها تُرجع معلومات إضافية عبر المعامل extra_info. تعتمد المعلومات المُرجعة على القيمة المحددة في flags، والتي يمكن أن تأخذ إحدى القيم التالية:
struct link_map {
ElfW(Addr) l_addr; /* الفرق بين العنوان
في ملف ELF والعنوان
في الذاكرة */
char *l_name; /* مسار المسار المطلق حيث
وُجد الكائن */
ElfW(Dyn) *l_ld; /* القسم الديناميكي للكائن
المشترك */
struct link_map *l_next, *l_prev;
/* سلسلة الكائنات المحملة */
/* بالإضافة إلى حقول إضافية خاصة بـ
التنفيذ */
};
typedef struct {
Elf64_Word st_name; /* اسم الرمز */
unsigned char st_info; /* نوع الرمز وربطه */
unsigned char st_other; /* رؤية الرمز */
Elf64_Section st_shndx; /* فهرس المقطع */
Elf64_Addr st_value; /* قيمة الرمز */
Elf64_Xword st_size; /* حجم الرمز */
} Elf64_Sym;
| القيمة | الوصف |
| STT_NOTYPE | نوع الرمز غير محدد |
| STT_OBJECT | الرمز هو كائن بيانات |
| STT_FUNC | الرمز هو كائن شيفرة |
| STT_SECTION | رمز مرتبط بقسم |
| STT_FILE | اسم الرمز هو اسم الملف |
| STT_COMMON | الرمز هو كائن بيانات مشترك |
| STT_TLS | الرمز هو كائن بيانات محلي للخيط |
| STT_GNU_IFUNC | الرمز هو كائن شيفرة غير مباشر |
| القيمة | الوصف |
| STB_LOCAL | رمز محلي |
| STB_GLOBAL | رمز عام |
| STB_WEAK | رمز ضعيف |
| STB_GNU_UNIQUE | رمز فريد |
| القيمة | الوصف |
| STV_DEFAULT | قواعد رؤية الرموز المبدئية |
| STV_INTERNAL | صنف مخفي خاص بالمعالج |
| STV_HIDDEN | الرمز غير متاح في الوحدات الأخرى |
| STV_PROTECTED | غير قابل للاستباق، غير مُصدَّر |
عند النجاح، تُرجع هذه الدوال قيمة غير صفرية. إذا أمكن مطابقة العنوان المحدد في addr مع كائن مشترك، ولكن ليس مع رمز في الكائن المشترك، فتُضبط حقول info->dli_sname و info->dli_saddr إلى NULL.
إذا لم يمكن مطابقة العنوان المحدد في addr مع كائن مشترك، فتُرجع هذه الدوال 0. في هذه الحالة، رسالة الخطأ غير متاحة عبر dlerror(3).
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
| الواجهة | السمة | القيمة |
| dladdr(), dladdr1() | سلامة الخيوط | MT-Safe |
GNU.
سولاريس.
أحيانًا، قد تفاجئك مؤشرات الدوال التي تمررها إلى dladdr(). على بعض البنى (خاصة i386 و x86-64)، قد ينتهي dli_fname و dli_fbase بالإشارة مرة أخرى إلى الكائن الذي استدعيت منه dladdr()، حتى لو كان من المفترض أن تأتي الدالة المستخدمة كوسيطة من مكتبة مرتبطة ديناميكيًا.
المشكلة هي أن مؤشر الدالة سيظل يُحل في وقت الترجمة، لكنه يشير فقط إلى قسم plt (جدول ربط الإجراءات) للكائن الأصلي (الذي يوزع الاستدعاء بعد طلب حل الرمز من الرابط الديناميكي). لتجاوز هذا، يمكنك محاولة ترجمة الكود ليكون مستقلاً عن الموقع: عندها، لا يمكن للمُصرِّف تحضير المؤشر في وقت الترجمة بعد الآن، وسيُولِّد gcc(1) كودًا يقوم فقط بتحميل عنوان الرمز النهائي من got (جدول الإزاحة العام) في وقت التشغيل قبل تمريره إلى dladdr().
dl_iterate_phdr(3)، dlinfo(3)، dlopen(3)، dlsym(3)، ld.so(8)
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.