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()
    glibc 2.0.

dladdr1()
    glibc 2.3.3.

سولاريس.

العلل
أحيانًا، قد تفاجئك مؤشرات الدوال التي تمررها إلى 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 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.