This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch feature/bundle_hide_symbols in repository https://gitbox.apache.org/repos/asf/celix.git
The following commit(s) were added to refs/heads/feature/bundle_hide_symbols by this push: new 1128583b Rewrite bundle symbol visibility paragraph 1128583b is described below commit 1128583bc09565ab92b942ba92c98bd779a2f0e9 Author: Pepijn Noltes <pepijnnol...@gmail.com> AuthorDate: Mon May 1 18:53:00 2023 +0200 Rewrite bundle symbol visibility paragraph --- documents/bundles.md | 42 +++++++++++----------- .../readme_c_examples/src/my_bundle_activator.c | 2 +- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/documents/bundles.md b/documents/bundles.md index 393df83e..e033b48e 100644 --- a/documents/bundles.md +++ b/documents/bundles.md @@ -238,26 +238,28 @@ Apache Celix services. This means that unless functionality is provided by means bundle functionality is private to the bundle. In Apache Celix symbols are kept private by loading bundle libraries locally (`dlopen` with `RTLD_LOCAL`). -## Symbol visibility for bundles -Bundles cannot directly access the symbols of another bundle and therefore the symbols of the bundle activator library -can be hidden with exception of the bundle activator create, start, stop and destroy functions. -The celix_bundle_activator.h header file ensures that the bundle activator symbols are exported. - -The benefits of hiding symbols for a bundle are: - - Smaller bundle libraries; - - Faster link-time and load-time; - - Smaller memory footprint; - - Better optimization opportunities. - -A downside is that it is harder to debug a bundle, but this is mostly when not compiling with the `-g` compiler flag. - -Note that to use and invoke C and C++ services from another bundle, there is no need to export the service symbols. -For C++ this is only the case if the provided services is based on a C++ header-only interface and for C this is always -the case, because C service structs does not result in any symbols. - -By default, the symbol visibility preset of the bundle activator library is configured to hidden. -This can be changed by providing the`DO_NOT_CONFIGURE_SYMBOL_VISIBILITY` option in the `add_celix_bundle` CMake -function call. +## Bundle symbol visibility +Since bundles are unable to directly access the symbols of another bundle, the default symbol visibility preset for the +bundle activator library is set to hidden. To modify this, supply the `DO_NOT_CONFIGURE_SYMBOL_VISIBILITY` option within the +`add_celix_bundle` CMake function call. + +Hiding symbols for a bundle offers several advantages, including: + +- Reduced bundle library size; +- Faster link-time and load-time; +- Lower memory usage; +- Enhanced optimization possibilities. + +However, one drawback can be that debugging a bundle becomes more difficult, particularly when not using the -g +compiler flag. + +It's important to note that exporting service symbols isn't necessary when utilizing and invoking C and C++ services +from another bundle. For C++, this only applies when the provided services are based on a C++ header-only interface, +while for C, this is always the case since C service structs don't produce any symbols. + +The bundle activator symbols (create, start, stop, and destroy) must be exported as they are invoked by the +Apache Celix framework. For this reason, the bundle activator functions in `celix_bundle_activator.h` are marked for +export. ### Example of disabling hiding of symbols for a bundle ```CMake diff --git a/examples/celix-examples/readme_c_examples/src/my_bundle_activator.c b/examples/celix-examples/readme_c_examples/src/my_bundle_activator.c index 35332de4..3aeff146 100644 --- a/examples/celix-examples/readme_c_examples/src/my_bundle_activator.c +++ b/examples/celix-examples/readme_c_examples/src/my_bundle_activator.c @@ -42,4 +42,4 @@ static celix_status_t myBundle_stop(my_bundle_activator_data_t *data __attribute return CELIX_SUCCESS; } -CELIX_GEN_BUNDLE_ACTIVATOR(my_bundle_activator_data_t, myBundle_start, myBundle_stop) \ No newline at end of file +CELIX_GEN_BUNDLE_ACTIVATOR(my_bundle_activator_data_t, myBundle_start, myBundle_stop)