لينكس dlopen: يمكن للمكتبة أن "أخطر" عندما يتم تحميل ذلك؟

StackOverflow https://stackoverflow.com/questions/1602398

  •  05-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لمكتبة المشتركة إلى أن "أخطر" عندما يتم تحميل ذلك؟

وبعبارة أخرى، دعونا نقول يمكنني استخدام <م> dlopen في مكتبة مشتركة، هناك وظيفة الذي يسمى تلقائيا (إن وجدت) على المكتبة المشتركة (على سبيل المثال الرئيسي؟)

هل كانت مفيدة؟

المحلول

<اقتباس فقرة>   

والمكتبات يجب تصدير التهيئة   وروتين تنظيف باستخدام دول مجلس التعاون الخليجي   __attribute __ ((منشئ)) و__attribute __ ((المدمر)) سمات وظيفة. انظر صفحات المعلومات لدول مجلس التعاون الخليجي   معلومات عن هذه. البناء   يتم تنفيذ الروتينية قبل dlopen   عودة (أو قبل الرئيسية () بدء   إذا تم تحميل مكتبة في الحمل   زمن). الروتين المدمر هي   أعدم قبل أن تعود dlclose (أو   بعد خروج () أو استكمال الرئيسية ()   إذا تم تحميل مكتبة في الحمل   زمن). النماذج C لهذه   وظائف هي:

 void __attribute__ ((constructor))  my_init(void);  
 void __attribute__  ((destructor)) my_fini(void);

http://tldp.org/HOWTO/Program-Library- HOWTO / index.html و

وهذا هو، يمكنك تك فقط على __attribute__ ((منشئ)) إلى الوظائف التي تريد أن يتم استدعاؤها عند تحميل مكتبة مشتركة. ويشير docuemtn فوق أيضا أن وظائف _ini و_fini القديمة تعتبر عفا عليها الزمن.

نصائح أخرى

نعم. عند فتح مكتبة، كل البناء ثابت يحدث ... لذلك، إذا كنت تستخدم C ++، يمكنك القيام به:

// mylibrary.cpp
namespace
{
    class dynamic_library_load_unload_handler
    {
         public:
              dynamic_library_load_unload_handler(){
                    // Code to execute when the library is loaded
              }
              ~dynamic_library_load_unload_handler(){
                    // Code to execute when the library is unloaded
              }
    } dynamic_library_load_unload_handler_hook;
}

وخلافا للحلول __attribute__ ((constructor)) الممنوحة، وسيكون هذا محمول. ملاحظة، على الرغم من أنه إذا كان لديك كائنات متعددة من هذا القبيل، ليس هناك ما يضمن فيما يتعلق البناء / النظام الدمار.

وعلى الأقل على لينكس، وربما على الأقل بعض أنظمة يونكس الأخرى، إذا تم فتح مكتبة حيوي وظيفة العالمية اسمه _init، إذا كان موجودا، سوف يتم استدعاؤها من قبل رابط ديناميكي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top