.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2003-2017, Michael Kerrisk .\" 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 dl_iterate_phdr 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم dl_iterate_phdr \- التجول في قائمة الكائنات المشتركة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fBint dl_iterate_phdr(\fP \fB typeof(int (struct dl_phdr_info *\fP\fIinfo\fP\fB, size_t \fP\fIsize\fP\fB, void *\fP\fIdata\fP\fB))\fP \fB *\fP\fIcallback\fP\fB,\fP \fB void *\fP\fIdata\fP\fB);\fP .fi .SH الوصف تسمح الدالة \fBdl_iterate_phdr\fP() للتطبيق بالاستعلام وقت التشغيل لمعرفة أي الكائنات المشتركة تم تحميلها، والترتيب الذي حُمّلت به. .P تتجول الدالة \fBdl_iterate_phdr\fP() في قائمة الكائنات المشتركة للتطبيق وتستدعي الدالة \fIcallback\fP مرة لكل كائن، حتى تتم معالجة جميع الكائنات المشتركة أو تُرجع \fIcallback\fP قيمة غير صفرية. .P تتلقى كل استدعاء لـ \fIcallback\fP ثلاث وسائط: \fIinfo\fP، وهو مؤشر لبنية تحتوي معلومات عن الكائن المشترك؛ \fIsize\fP، وهو حجم البنية المشار إليها بـ \fIinfo\fP؛ و \fIdata\fP، وهو نسخة من أي قيمة مررها البرنامج المستدعي كالوسيطة الثانية (المسماة أيضًا \fIdata\fP) في استدعاء \fBdl_iterate_phdr\fP(). .P الوسيطة \fIinfo\fP هي بنية من النوع التالي: .P .in +4n .EX struct dl_phdr_info { ElfW(Addr) dlpi_addr; /* عنوان قاعدة الكائن */ const char *dlpi_name; /* اسم الكائن (منتهٍ بصفر) */ const ElfW(Phdr) *dlpi_phdr; /* مؤشر لمصفوفة رؤوس برامج ELF لهذا الكائن */ ElfW(Half) dlpi_phnum; /* عدد العناصر في \f[I]dlpi_phdr\fR */ \& /* الحقول التالية أُضيفت في glibc 2.4، بعد توفر النسخة الأولى من هذه البنية. تحقق من الوسيطة \f[I]size\fR الممررة إلى استدعاء dl_iterate_phdr callback لتحديد ما إذا كان كل عضو لاحق متاحًا. */ \& unsigned long long dlpi_adds; /* يُزاد عند إضافة كائن جديد */ unsigned long long dlpi_subs; /* يُزاد عند إزالة كائن */ size_t dlpi_tls_modid; /* إذا كان هناك مقطع PT_TLS، معرف وحدته المستخدم في إعادة توطين TLS، وإلا صفر */ void *dlpi_tls_data; /* عنوان مثيل الخيط المستدعي لمقطع PT_TLS لهذه الوحدة، إذا كان لديها واحد وتم تخصيصه في الخيط المستدعي، وإلا مؤشر فارغ */ }; .EE .in .P (تحول تعريف الماكرو \fIElfW\fP() وسيطته إلى اسم نوع بيانات ELF مناسب لبنية العتاد. على سبيل المثال، على منصة 32 بت، يُنتج \fIElfW(Addr)\fP اسم نوع البيانات \fIElf32_Addr\fP. يمكن العثور على مزيد من المعلومات حول هذه الأنواع في ملفي الرأس \fI\fP و \fI\fP.) .P يشير الحقل \fIdlpi_addr\fP إلى عنوان قاعدة الكائن المشترك (أي الفرق بين عنوان الذاكرة الافتراضية للكائن المشترك وإزاحة ذلك الكائن في الملف الذي حُمّل منه). الحقل \fIdlpi_name\fP هو سلسلة محارف منتهية بصفر تعطي اسم المسار الذي حُمّل منه الكائن المشترك. .P لفهم معنى الحقلين \fIdlpi_phdr\fP و \fIdlpi_phnum\fP، يجب أن ندرك أن الكائن المشترك ELF يتكون من عدد من المقاطع، لكل منها رأس برنامج مقابل يصف المقطع. الحقل \fIdlpi_phdr\fP هو مؤشر لمصفوفة رؤوس البرامج لهذا الكائن المشترك. الحقل \fIdlpi_phnum\fP يشير إلى حجم هذه المصفوفة. .P رؤوس البرامج هذه هي بنى من الشكل التالي: .P .in +4n .EX typedef struct { Elf32_Word p_type; /* نوع المقطع */ Elf32_Off p_offset; /* إزاحة المقطع في الملف */ Elf32_Addr p_vaddr; /* عنوان المقطع الافتراضي */ Elf32_Addr p_paddr; /* عنوان المقطع الفعلي */ Elf32_Word p_filesz; /* حجم المقطع في الملف */ Elf32_Word p_memsz; /* حجم المقطع في الذاكرة */ Elf32_Word p_flags; /* أعلام المقطع */ Elf32_Word p_align; /* محاذاة المقطع */ } Elf32_Phdr; .EE .in .P لاحظ أنه يمكن حساب موقع رأس برنامج معين، \fIx\fP، في الذاكرة الافتراضية باستخدام الصيغة: .P .in +4n .EX addr == info\->dlpi_addr + info\->dlpi_phdr[x].p_vaddr; .EE .in .P القيم المحتملة لـ \fIp_type\fP تشمل التالي (انظر \fI\fP لمزيد من التفاصيل): .P .in +4n .EX .\" For PT_GNU_STACK, see http://www.airs.com/blog/archives/518 #define PT_LOAD 1 /* مقطع برنامج قابل للتحميل */ #define PT_DYNAMIC 2 /* معلومات الربط الديناميكي */ #define PT_INTERP 3 /* مفسر البرنامج */ #define PT_NOTE 4 /* معلومات مساعدة */ #define PT_SHLIB 5 /* محجوز */ #define PT_PHDR 6 /* إدخال لجدول الرأس نفسه */ #define PT_TLS 7 /* مقطع تخزين محلي للخيط */ #define PT_GNU_EH_FRAME 0x6474e550 /* مقطع GCC .eh_frame_hdr */ #define PT_GNU_STACK 0x6474e551 /* يشير إلى قابلية تنفيذ المكدس */ #define PT_GNU_RELRO 0x6474e552 /* للقراءة فقط بعد إعادة التوطين */ .EE .in .SH "قيمة الإرجاع" تُرجع الدالة \fBdl_iterate_phdr\fP() أي قيمة أُرجعت بواسطة آخر استدعاء لـ \fIcallback\fP. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBdl_iterate_phdr\fP() T} سلامة الخيوط MT\-Safe .TE .SH الإصدارات توفر أنظمة أخرى متنوعة نسخة من هذه الدالة، على الرغم من اختلاف تفاصيل بنية \fIdl_phdr_info\fP المُرجعة. في BSDs و Solaris، تتضمن البنية الحقول \fIdlpi_addr\fP و \fIdlpi_name\fP و \fIdlpi_phdr\fP و \fIdlpi_phnum\fP بالإضافة إلى حقول أخرى خاصة بالتطبيق. .P قد تُضيف الإصدارات المستقبلية من مكتبة C حقولاً إضافية إلى بنية \fIdl_phdr_info\fP؛ في هذه الحالة، تُوفّر الوسيطة \fIsize\fP آلية لدالة الاستدعاء لمعرفة ما إذا كانت تُنفّذ على نظام يحتوي على حقول مُضافة. .SH المعايير لا شيء. .SH التاريخ glibc 2.2.4. .SH ملاحظات أول كائن يزوره \fIcallback\fP هو البرنامج الرئيس. بالنسبة للبرنامج الرئيس، سيكون الحقل \fIdlpi_name\fP سلسلة محارف فارغة. .SH أمثلة يعرض البرنامج التالي قائمة بمسارات الكائنات المُشاركة التي حُمّلت. لكل كائن مُشارك، يُدرج البرنامج بعض المعلومات (العنوان الافتراضي، الحجم، الأعلام، والنوع) لكل قطعة ELF من الكائن. .P تُظهر جلسة الصدفة التالية المخرجات التي يُنتجها البرنامج على نظام x86\-64. أول كائن مُشارك تُعرض مخرجاته (حيث الاسم سلسلة محارف فارغة) هو البرنامج الرئيس. .P .in +4n .EX $\fB ./a.out\fP; Name: "" (9 segments) 0: [ 0x400040; memsz: 1f8] flags: 0x5; PT_PHDR 1: [ 0x400238; memsz: 1c] flags: 0x4; PT_INTERP 2: [ 0x400000; memsz: ac4] flags: 0x5; PT_LOAD 3: [ 0x600e10; memsz: 240] flags: 0x6; PT_LOAD 4: [ 0x600e28; memsz: 1d0] flags: 0x6; PT_DYNAMIC 5: [ 0x400254; memsz: 44] flags: 0x4; PT_NOTE 6: [ 0x400970; memsz: 3c] flags: 0x4; PT_GNU_EH_FRAME 7: [ (nil); memsz: 0] flags: 0x6; PT_GNU_STACK 8: [ 0x600e10; memsz: 1f0] flags: 0x4; PT_GNU_RELRO Name: "linux\-vdso.so.1" (4 segments) 0: [0x7ffc6edd1000; memsz: e89] flags: 0x5; PT_LOAD 1: [0x7ffc6edd1360; memsz: 110] flags: 0x4; PT_DYNAMIC 2: [0x7ffc6edd17b0; memsz: 3c] flags: 0x4; PT_NOTE 3: [0x7ffc6edd17ec; memsz: 3c] flags: 0x4; PT_GNU_EH_FRAME Name: "/lib64/libc.so.6" (10 segments) 0: [0x7f55712ce040; memsz: 230] flags: 0x5; PT_PHDR 1: [0x7f557145b980; memsz: 1c] flags: 0x4; PT_INTERP 2: [0x7f55712ce000; memsz: 1b6a5c] flags: 0x5; PT_LOAD 3: [0x7f55716857a0; memsz: 9240] flags: 0x6; PT_LOAD 4: [0x7f5571688b80; memsz: 1f0] flags: 0x6; PT_DYNAMIC 5: [0x7f55712ce270; memsz: 44] flags: 0x4; PT_NOTE 6: [0x7f55716857a0; memsz: 78] flags: 0x4; PT_TLS 7: [0x7f557145b99c; memsz: 544c] flags: 0x4; PT_GNU_EH_FRAME 8: [0x7f55712ce000; memsz: 0] flags: 0x6; PT_GNU_STACK 9: [0x7f55716857a0; memsz: 3860] flags: 0x4; PT_GNU_RELRO Name: "/lib64/ld\-linux\-x86\-64.so.2" (7 segments) 0: [0x7f557168f000; memsz: 20828] flags: 0x5; PT_LOAD 1: [0x7f55718afba0; memsz: 15a8] flags: 0x6; PT_LOAD 2: [0x7f55718afe10; memsz: 190] flags: 0x6; PT_DYNAMIC 3: [0x7f557168f1c8; memsz: 24] flags: 0x4; PT_NOTE 4: [0x7f55716acec4; memsz: 604] flags: 0x4; PT_GNU_EH_FRAME 5: [0x7f557168f000; memsz: 0] flags: 0x6; PT_GNU_STACK 6: [0x7f55718afba0; memsz: 460] flags: 0x4; PT_GNU_RELRO .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (dl_iterate_phdr.c) \& .EX #define _GNU_SOURCE #include #include #include #include \& static int callback(struct dl_phdr_info *info, size_t size, void *data) { char *type; int p_type; \& printf("Name: \[rs]"%s\[rs]" (%d segments)\[rs]n", info\->dlpi_name, info\->dlpi_phnum); \& for (size_t j = 0; j < info\->dlpi_phnum; j++) { p_type = info\->dlpi_phdr[j].p_type; type = (p_type == PT_LOAD) ? "PT_LOAD" : (p_type == PT_DYNAMIC) ? "PT_DYNAMIC" : (p_type == PT_INTERP) ? "PT_INTERP" : (p_type == PT_NOTE) ? "PT_NOTE" : (p_type == PT_INTERP) ? "PT_INTERP" : (p_type == PT_PHDR) ? "PT_PHDR" : (p_type == PT_TLS) ? "PT_TLS" : (p_type == PT_GNU_EH_FRAME) ? "PT_GNU_EH_FRAME" : (p_type == PT_GNU_STACK) ? "PT_GNU_STACK" : (p_type == PT_GNU_RELRO) ? "PT_GNU_RELRO" : NULL; \& printf(" %2zu: [%14p; memsz:%7jx] flags: %#jx; ", j, (void *) (info\->dlpi_addr + info\->dlpi_phdr[j].p_vaddr), (uintmax_t) info\->dlpi_phdr[j].p_memsz, (uintmax_t) info\->dlpi_phdr[j].p_flags); if (type != NULL) printf("%s\[rs]n", type); else printf("[other (%#x)]\[rs]n", p_type); } \& return 0; } \& int main(void) { dl_iterate_phdr(callback, NULL); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBldd\fP(1), \fBobjdump\fP(1), \fBreadelf\fP(1), \fBdladdr\fP(3), \fBdlopen\fP(3), \fBelf\fP(5), \fBld.so\fP(8) .P \fIمواصفات تنسيق التنفيذ والربط\fP، متوفرة في مواقع متعددة على الإنترنت. .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .