Does Clang/GCC really support a delay loading feature?

前端 未结 2 1763
北荒
北荒 2020-12-09 22:12

Would you mind to leave your comment on this if you have really experienced which relates to the title above? I have tried to make a shared object to be del

2条回答
  •  时光说笑
    2020-12-09 22:48

    This is more a question of functionality provided by the run time linker, ld-linux.so.

    This linker does support lazy binding of symbols, but not lazy loading of libraries. What this means is that each of the shared objects which an executable requires are loaded when the program starts, but the symbols within the program are not resolved to the loaded libraries until they are first referenced.

    The reason for this is performance. A library may contain many thousands of symbols for functions that never get called in a single execution of a program. Resolving them all would be a waste of time.

    For this reason, if a library does not contain the expected symbols, you can get 'undefined symbol' errors well after the program has started running, but if a library is missing altogether, you will get an error before the program starts.

    The -zlazy option which you are quoting controls lazy symbol binding only. In fact it is enabled by default (at least for GCC, I did not check for clang).

    The only way to have a library loaded after program startup, for example in response to some command line option, configuration or other dynamic condition, is to call dlopen.

    You might want to look around for a good plugin framework - for references see:

    • Cross-Platform C++ Dynamic Library Plugin Loader
    • What's safe for a C++ plug-in system?
    • Good patterns for a C/C++ plugin-based system?

提交回复
热议问题