البرمجة

عرض توقيعات وظائف C من مكتبة معينة

في لغة البرمجة C، يمكنك عرض التوقيعات (prototypes) لجميع الوظائف المتاحة في مكتبة معينة باستخدام الكود التالي:

c
#include #include #include void showAvailFunctions(const char *libName) { void *handle = dlopen(libName, RTLD_LAZY); if (!handle) { fprintf(stderr, "Error: Unable to open library %s\n", libName); return; } dlerror(); // Clear any existing error // Define a function pointer for a function that takes no arguments and returns void typedef void (*func_ptr)(void); // Loop through all symbols in the library const char *symbolName; while ((symbolName = dlerror()) == NULL) { func_ptr function = (func_ptr)dlsym(handle, symbolName); if (function != NULL) { printf("%s\n", symbolName); } } dlclose(handle); } int main() { showAvailFunctions("stdlib.h"); return 0; }

يقوم الكود بفتح المكتبة المعنية باستخدام dlopen() ومن ثم يستخدم dlsym() للحصول على عنوان كل وظيفة في المكتبة. إذا تم العثور على عنوان لوظيفة، يتم طباعة اسم الوظيفة.

المزيد من المعلومات

لتوضيح الكود السابق، يجب أن نفهم بعض المفاهيم الأساسية:

  1. dlopen(): هذه الدالة تستخدم لفتح ملف مكتبة ديناميكية وإرجاع مقبض (handle) لها. يمكن أن يكون الاسم الكامل للمكتبة (مثل “libc.so.6”) أو اسم ملف بسيط (مثل “stdlib.h”) حسب النظام.

  2. dlsym(): تُستخدم للعثور على عنوان وظيفة معينة (symbol) في ملف المكتبة المفتوح. يتم تحميل العنوان المسترجع إلى مؤشر دالة مناسب النوع func_ptr، ثم يتم استدعاء الدالة للتأكد من أنها تعمل بشكل صحيح.

  3. dlerror(): تُستخدم للتحقق من وجود أي خطأ حدث أثناء استدعاء dlopen() أو dlsym().

  4. dlclose(): تستخدم لإغلاق المكتبة المفتوحة بواسطة dlopen().

تنبيه: يجب استخدام هذا الكود بحذر، خاصةً في بيئات غير آمنة، حيث قد يؤدي البحث عن وظائف المكتبة المفتوحة إلى مشاكل أمنية.

شاهد أيضاً
إغلاق
زر الذهاب إلى الأعلى