- unstable 4.31.0-1
| dladdr(3) | Library Functions Manual | dladdr(3) |
الاسم¶
dladdr, dladdr1 - ترجمة عنوان إلى معلومات رمزية
المكتبة¶
مكتبة الربط الديناميكي (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، والتي يمكن أن تأخذ إحدى القيم التالية:
- RTLD_DL_LINKMAP
- الحصول على مؤشر لخريطة الربط للملف المطابق. يشير معامل extra_info إلى مؤشر لبنية link_map (أي struct link_map **)، المُعرفة في <link.h> كالتالي:
-
struct link_map {
ElfW(Addr) l_addr; /* الفرق بين العنوان
في ملف ELF والعنوان
في الذاكرة */
char *l_name; /* مسار المسار المطلق حيث
وُجد الكائن */
ElfW(Dyn) *l_ld; /* القسم الديناميكي للكائن
المشترك */
struct link_map *l_next, *l_prev;
/* سلسلة الكائنات المحملة */
/* بالإضافة إلى حقول إضافية خاصة بـ
التنفيذ */ };
- RTLD_DL_SYMENT
- الحصول على مؤشر لإدخال جدول رموز ELF للرمز المطابق. معامل extra_info هو مؤشر لمؤشر رمز: const ElfW(Sym) **. يحول تعريف الماكرو ElfW() معاملته إلى اسم نوع بيانات ELF مناسب لبنية العتاد. على سبيل المثال، على منصة 64 بت، يُنتج ElfW(Sym) اسم نوع البيانات Elf64_Sym، المُعرف في <elf.h> كالتالي:
-
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;
- حقل st_name هو فهرس في جدول السلاسل.
- يُرمّز حقل
st_info نوع
الرمز
وربطه. يمكن
استخراج
النوع
باستخدام
الماكرو
ELF64_ST_TYPE(st_info) (أو ELF32_ST_TYPE()
على منصات 32
بت)، والذي
يُنتج إحدى
القيم
التالية:
القيمة الوصف STT_NOTYPE نوع الرمز غير محدد STT_OBJECT الرمز هو كائن بيانات STT_FUNC الرمز هو كائن شيفرة STT_SECTION رمز مرتبط بقسم STT_FILE اسم الرمز هو اسم الملف STT_COMMON الرمز هو كائن بيانات مشترك STT_TLS الرمز هو كائن بيانات محلي للخيط STT_GNU_IFUNC الرمز هو كائن شيفرة غير مباشر
- يمكن
استخراج
ربط الرمز
من حقل st_info
باستخدام
الكليّة
ELF64_ST_BIND(st_info) (أو ELF32_ST_BIND()
على منصات
32-بت)، والتي
تُنتج إحدى
القيم
التالية:
القيمة الوصف STB_LOCAL رمز محلي STB_GLOBAL رمز عام STB_WEAK رمز ضعيف STB_GNU_UNIQUE رمز فريد
- حقل st_other
يحتوي على
رؤية
الرمز،
والتي يمكن
استخراجها
باستخدام
الكليّة
ELF64_ST_VISIBILITY(st_info) (أو
ELF32_ST_VISIBILITY() على
منصات 32-بت)،
والتي
تُنتج إحدى
القيم
التالية:
القيمة الوصف 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.
| 8 فبراير 2026 | صفحات دليل لينكس 6.18 |