Skip to content

Breakage on Gazebo Ionic due to symbol visiblity change in gz-cmake #188

Description

@j-aub

Hi, I've been having some trouble running gz-waves on Gazebo Ionic. Plugins are failing to load with an error like this:

[gazebo-1] Error while loading the library [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-hydrodynamics-system.so]: /nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-hydrodynamics-system.so: undefined symbol: _ZN2gz5waves13HydrodynamicsC1ESt10shared_ptrIKNS0_23HydrodynamicsParametersEES2_IKN4CGAL12Surface_meshINS6_7Point_3INS6_16Simple_cartesianIdEEEEEEES2_IKNS0_16WavefieldSamplerEE
[gazebo-1] (2026-04-12 17:02:01.130) [error] [SystemLoader.cc:169] Failed to load system plugin: (Reason: No plugins detected in library)
[gazebo-1] - Requested plugin name: [gz::sim::systems::Hydrodynamics]
[gazebo-1] - Requested library name: [gz-waves1-hydrodynamics-system]
[gazebo-1] - Resolved library path: [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-hydrodynamics-system.so]
[gazebo-1] (2026-04-12 17:02:01.141) [debug] [CameraZoomPlugin.cc:309] CameraZoomPlugin attached to sensor [camera].
[gazebo-1] (2026-04-12 17:02:01.142) [debug] [CameraZoomPlugin.cc:380] CameraZoomPlugin subscribing to messages on [/model/gimbal/sensor/camera/zoom/cmd_zoom]
[gazebo-1] (2026-04-12 17:02:01.142) [debug] [SystemManager.cc:80] Loaded system [CameraZoomPlugin] for entity [52]
[gazebo-1] (2026-04-12 17:02:01.243) [info] [GstCameraPlugin.cc:127] GstCameraPlugin: attached to sensor [camera]
[gazebo-1] (2026-04-12 17:02:01.243) [info] [GstCameraPlugin.cc:146] GstCameraPlugin: streaming video to 127.0.0.1:5600
[gazebo-1] (2026-04-12 17:02:01.243) [debug] [SystemManager.cc:80] Loaded system [GstCameraPlugin] for entity [52]
[gazebo-1] Error while loading the library [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-waves-visual-system.so]: /nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-waves-visual-system.so: undefined symbol: _ZNK2gz5waves14WaveParameters9SteepnessEv
[gazebo-1] (2026-04-12 17:02:01.261) [error] [SystemLoader.cc:169] Failed to load system plugin: (Reason: No plugins detected in library)
[gazebo-1] - Requested plugin name: [gz::sim::systems::WavesVisual]
[gazebo-1] - Requested library name: [gz-waves1-waves-visual-system]
[gazebo-1] - Resolved library path: [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-waves-visual-system.so]

I believe this happens because gz-cmake4 introduced a change (gazebosim/gz-cmake#392) that sets -fvisibility=hidden by default. Because of that, libgz-waves1.so no longer exports some needed symbols.

gz-waves built against Gazebo Harmonic (gz-cmake3):

$ readelf -aW ./lib/libgz-waves1.so | grep _ZNK2gz5waves14WaveParameters9SteepnessEv
00000000000f62e0  0000022700000007 R_X86_64_JUMP_SLOT     00000000000b1f60 _ZNK2gz5waves14WaveParameters9SteepnessEv + 0
   551: 00000000000b1f60    13 FUNC    GLOBAL DEFAULT   14 _ZNK2gz5waves14WaveParameters9SteepnessEv
   393: 00000000000b1f60    13 FUNC    GLOBAL DEFAULT   14 _ZNK2gz5waves14WaveParameters9SteepnessEv

Gazebo Ionic (gz-cmake4):

$ readelf -aW ./lib/libgz-waves1.so | grep _ZNK2gz5waves14WaveParameters9SteepnessEv
   232: 0000000000066ee0    13 FUNC    LOCAL  DEFAULT   14 _ZNK2gz5waves14WaveParameters9SteepnessEv

As suggested in the gz-cmake pull request, adding "EXPOSE_SYMBOLS_BY_DEFAULT" to gz_configure_build() fixes the issue.

gz_configure_build(QUIT_IF_BUILD_ERRORS)

To reproduce:

// gcc test.c -o test
#include <assert.h>
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

// plugin loading logic copied from gz-plugin
int main(int argc, char *argv[]) {
        // need path
        assert(argc > 1);

        // clear errors
        dlerror();

        printf("opening %s\n", argv[1]);

        void *dlHandle = dlopen(argv[1], RTLD_LAZY | RTLD_LOCAL);
        const char *loadError = dlerror();

        if(dlHandle == NULL || loadError != NULL) {
                printf("load error: %s\n", loadError);
                return 1;
        }

        printf("loaded\n");
}
$ find ./lib -type f -name '*.so.1.0.0' -exec ./test \{\} \;
opening ./lib/libgz-waves1.so.1.0.0
loaded
opening ./lib/libgz-waves1-dynamic-geometry-system.so.1.0.0
loaded
opening ./lib/libgz-waves1-hydrodynamics-system.so.1.0.0
load error: ./lib/libgz-waves1-hydrodynamics-system.so.1.0.0: undefined symbol: _ZN2gz5waves13HydrodynamicsC1ESt10shared_ptrIKNS0_23HydrodynamicsParametersEES2_IKN4CGAL12Surface_meshINS6_7Point_3INS6_16Simple_cartesianIdEEEEEEES2_IKNS0_16WavefieldSamplerEE
opening ./lib/libgz-waves1-rendering.so.1.0.0
loaded
opening ./lib/libgz-waves1-rendering-ogre2.so.1.0.0
load error: ./lib/libgz-waves1-rendering-ogre2.so.1.0.0: undefined symbol: _ZNK2gz5waves10OceanTileTINS_4math2v87Vector3IdEEE3UV0El
opening ./lib/libgz-waves1-waves-visual-system.so.1.0.0
load error: ./lib/libgz-waves1-waves-visual-system.so.1.0.0: undefined symbol: _ZNK2gz5waves14WaveParameters9SteepnessEv
opening ./lib/libgz-waves1-waves-model-system.so.1.0.0
load error: ./lib/libgz-waves1-waves-model-system.so.1.0.0: undefined symbol: _ZN2gz5waves9WavefieldD0Ev

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions