في لغة البرمجة 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()
للحصول على عنوان كل وظيفة في المكتبة. إذا تم العثور على عنوان لوظيفة، يتم طباعة اسم الوظيفة.
المزيد من المعلومات
لتوضيح الكود السابق، يجب أن نفهم بعض المفاهيم الأساسية:
-
dlopen()
: هذه الدالة تستخدم لفتح ملف مكتبة ديناميكية وإرجاع مقبض (handle) لها. يمكن أن يكون الاسم الكامل للمكتبة (مثل “libc.so.6”) أو اسم ملف بسيط (مثل “stdlib.h”) حسب النظام. -
dlsym()
: تُستخدم للعثور على عنوان وظيفة معينة (symbol) في ملف المكتبة المفتوح. يتم تحميل العنوان المسترجع إلى مؤشر دالة مناسب النوعfunc_ptr
، ثم يتم استدعاء الدالة للتأكد من أنها تعمل بشكل صحيح. -
dlerror()
: تُستخدم للتحقق من وجود أي خطأ حدث أثناء استدعاءdlopen()
أوdlsym()
. -
dlclose()
: تستخدم لإغلاق المكتبة المفتوحة بواسطةdlopen()
.
تنبيه: يجب استخدام هذا الكود بحذر، خاصةً في بيئات غير آمنة، حيث قد يؤدي البحث عن وظائف المكتبة المفتوحة إلى مشاكل أمنية.