Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Undefined reference/symbol for dynamically linked glslang module #44536

Closed
Tracked by #39196
LinuxUserGD opened this issue Dec 20, 2020 · 3 comments · Fixed by #56722
Closed
Tracked by #39196

Undefined reference/symbol for dynamically linked glslang module #44536

LinuxUserGD opened this issue Dec 20, 2020 · 3 comments · Fixed by #56722

Comments

@LinuxUserGD
Copy link
Contributor

LinuxUserGD commented Dec 20, 2020

Godot version:

godot.linuxbsd.opt.tools.64.llvm --version
4.0.dev.custom_build.a511a26ad

glslangValidator --version
Glslang Version: 10:11.0.0
ESSL Version: OpenGL ES GLSL 3.20 glslang Khronos. 11.0.0
GLSL Version: 4.60 glslang Khronos. 11.0.0
SPIR-V Version 0x00010500, Revision 4
GLSL.std.450 Version 100, Revision 1
Khronos Tool ID 8
SPIR-V Generator Version 10
GL_KHR_vulkan_glsl version 100
ARB_GL_gl_spirv version 100

clang --version
clang version 11.0.1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm/11/bin

OS/device including version:

Gentoo Linux

Issue description:

Compiling godot on gentoo with this ebuild: https://cgit.gentoo.org/repo/user/Drauthius.git/tree/dev-games/godot/godot-9999.ebuild?id=4034cbc02a58c457e29973bfad3e3b6f875e12dd
(flags below) doesn't work with dynamically linked external glslang.

MYSCONS=(
		CC="$(tc-getCC)"
		CXX="$(tc-getCXX)"
		builtin_enet=$(usex enet)
		builtin_freetype=no
		builtin_glslang=no
		builtin_libogg=no
		builtin_libpng=no
		builtin_libtheora=$(usex theora)
		builtin_libvorbis=$(usex vorbis)
		builtin_libvpx=no
		builtin_libwebp=$(usex webp)
		builtin_mbedtls=$(usex mbedtls)
		builtin_miniupnpc=no
		builtin_opus=$(usex opus)
		builtin_pcre2=no
		builtin_vulkan=$(usex vulkan)
		builtin_zlib=no
		builtin_zstd=no
		module_enet_enabled=$(usex enet)
		module_freetype_enabled=$(usex freetype)
		module_mbedtls_enabled=$(usex mbedtls)
		module_opus_enabled=$(usex opus)
		module_theora_enabled=$(usex theora)
		module_vorbis_enabled=$(usex vorbis)
		module_webp_enabled=$(usex webp)
		platform=$(usex X linuxbsd server)
		pulseaudio=$(usex pulseaudio)
		tools=yes
		progress=false
		verbose=true
		udev=$(usex udev)
		use_llvm=$(usex llvm)
		use_lld=$(usex llvm)
		use_lto=$(usex lto)
		target=$(usex debug debug release_debug)
	)

However it compiles fine with these additional flags: -L/usr/lib64/ -lglslang-default-resource-limits

Steps to reproduce:

  • Install glslang and spirv
  • Move StandAlone folder from https://github.com/KhronosGroup/glslang/tree/master/StandAlone to /usr/include/StandAlone (which is required by godot/glslang include file)
  • make sure, there is /usr/lib64/libglslang-default-resource-limits.so (dynamically compiled library)
  • add builtin_glslang=no to scons command
  • without additional LDFLAGS/LDLIBS flags -L/usr/lib64/ -lglslang-default-resource-limits, compilation fails with this error output:

Output1:

llvm.a modules/libmodule_dds.linuxbsd.opt.tools.64.llvm.a modules/libmodule_cvtt.linuxbsd.opt.tools.64.llvm.a modules/libmodule_csg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bullet.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bmp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_basis_universal.linuxbsd.opt.tools.64.llvm.a modules/libmodule_assimp.linuxbsd.opt.tools.64.llvm.a platform/libplatform.linuxbsd.opt.tools.64.llvm.a drivers/libdrivers.linuxbsd.opt.tools.64.llvm.a editor/libeditor.linuxbsd.opt.tools.64.llvm.a scene/libscene.linuxbsd.opt.tools.64.llvm.a servers/libservers.linuxbsd.opt.tools.64.llvm.a core/libcore.linuxbsd.opt.tools.64.llvm.a modules/freetype/libfreetype_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libharfbuzz_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libgraphite_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libicu_builtin.linuxbsd.opt.tools.64.llvm.a -lXcursor -lXinerama -lXext -lXrandr -lXrender -lX11 -lXi -lzstd -lvpx -lm -logg -lminiupnpc -lpcre2-32 -lasound -lpulse -ludev -lglslang -lSPIRV -lGL -lpthread -ldl
/usr/bin/x86_64-pc-linux-gnu-ld: modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a(register_types.linuxbsd.opt.tools.64.llvm.o): in function `_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)':
/var/tmp/portage/dev-games/godot-9999/work/godot-9999/modules/glslang/register_types.cpp:73: undefined reference to `glslang::DefaultTBuiltInResource'
/usr/bin/x86_64-pc-linux-gnu-ld: /var/tmp/portage/dev-games/godot-9999/work/godot-9999/modules/glslang/register_types.cpp:73: undefined reference to `glslang::TShader::preprocess(TBuiltInResource const*, int, EProfile, bool, bool, EShMessages, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, glslang::TShader::Includer&)'
/usr/bin/x86_64-pc-linux-gnu-ld: modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a(register_types.linuxbsd.opt.tools.64.llvm.o): in function `glslang::TShader::parse(TBuiltInResource const*, int, EProfile, bool, bool, EShMessages)':
/usr/include/glslang/Public/ShaderLang.h:633: undefined reference to `glslang::DefaultTBuiltInResource'
/usr/bin/x86_64-pc-linux-gnu-ld: modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a(register_types.linuxbsd.opt.tools.64.llvm.o): in function `_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)':
/var/tmp/portage/dev-games/godot-9999/work/godot-9999/modules/glslang/register_types.cpp:116: undefined reference to `glslang::GlslangToSpv(glslang::TIntermediate const&, std::vector<unsigned int, std::allocator<unsigned int> >&, spv::SpvBuildLogger*, glslang::SpvOptions*)'
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
scons: *** [bin/godot.linuxbsd.opt.tools.64.llvm] Error 1
scons: building terminated because of errors.
 * ERROR: dev-games/godot-9999::gentoo failed (compile phase):
 *   escons failed.
  • after enabling those flags globally, compiling works but fails at linking:

Output2:

clang++ -o bin/godot.linuxbsd.opt.tools.64.llvm -O2 -pipe -L/usr/lib64/ -lglslang-default-resource-limits -fuse-ld=lld -pipe -no-pie platform/linuxbsd/godot_linuxbsd.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/crash_handler_linuxbsd.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/os_linuxbsd.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/joypad_linux.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/context_gl_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/detect_prime_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/display_server_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/vulkan_context_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/key_mapping_x11.linuxbsd.opt.tools.64.llvm.o main/libmain.linuxbsd.opt.tools.64.llvm.a modules/libmodules.linuxbsd.opt.tools.64.llvm.a modules/libmodule_xatlas_unwrap.linuxbsd.opt.tools.64.llvm.a modules/libmodule_websocket.linuxbsd.opt.tools.64.llvm.a modules/libmodule_webrtc.linuxbsd.opt.tools.64.llvm.a modules/libmodule_webp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_webm.linuxbsd.opt.tools.64.llvm.a modules/libmodule_vorbis.linuxbsd.opt.tools.64.llvm.a modules/libmodule_visual_script.linuxbsd.opt.tools.64.llvm.a modules/libmodule_vhacd.linuxbsd.opt.tools.64.llvm.a modules/libmodule_upnp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_tinyexr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_theora.linuxbsd.opt.tools.64.llvm.a modules/libmodule_tga.linuxbsd.opt.tools.64.llvm.a modules/libmodule_text_server_adv.linuxbsd.opt.tools.64.llvm.a modules/libmodule_svg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_stb_vorbis.linuxbsd.opt.tools.64.llvm.a modules/libmodule_squish.linuxbsd.opt.tools.64.llvm.a modules/libmodule_regex.linuxbsd.opt.tools.64.llvm.a modules/libmodule_pvr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_opus.linuxbsd.opt.tools.64.llvm.a modules/libmodule_opensimplex.linuxbsd.opt.tools.64.llvm.a modules/libmodule_ogg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_mobile_vr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_minimp3.linuxbsd.opt.tools.64.llvm.a modules/libmodule_meshoptimizer.linuxbsd.opt.tools.64.llvm.a modules/libmodule_mbedtls.linuxbsd.opt.tools.64.llvm.a modules/libmodule_lightmapper_rd.linuxbsd.opt.tools.64.llvm.a modules/libmodule_jsonrpc.linuxbsd.opt.tools.64.llvm.a modules/libmodule_jpg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_hdr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gridmap.linuxbsd.opt.tools.64.llvm.a modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gdscript.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gdnavigation.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gdnative.linuxbsd.opt.tools.64.llvm.a modules/libmodule_freetype.linuxbsd.opt.tools.64.llvm.a modules/libmodule_etc.linuxbsd.opt.tools.64.llvm.a modules/libmodule_enet.linuxbsd.opt.tools.64.llvm.a modules/libmodule_denoise.linuxbsd.opt.tools.64.llvm.a modules/libmodule_dds.linuxbsd.opt.tools.64.llvm.a modules/libmodule_cvtt.linuxbsd.opt.tools.64.llvm.a modules/libmodule_csg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bullet.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bmp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_basis_universal.linuxbsd.opt.tools.64.llvm.a modules/libmodule_assimp.linuxbsd.opt.tools.64.llvm.a platform/libplatform.linuxbsd.opt.tools.64.llvm.a drivers/libdrivers.linuxbsd.opt.tools.64.llvm.a editor/libeditor.linuxbsd.opt.tools.64.llvm.a scene/libscene.linuxbsd.opt.tools.64.llvm.a servers/libservers.linuxbsd.opt.tools.64.llvm.a core/libcore.linuxbsd.opt.tools.64.llvm.a modules/freetype/libfreetype_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libharfbuzz_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libgraphite_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libicu_builtin.linuxbsd.opt.tools.64.llvm.a -lXcursor -lXinerama -lXext -lXrandr -lXrender -lX11 -lXi -lzstd -lvpx -lm -logg -lminiupnpc -lpcre2-32 -lasound -lpulse -ludev -lglslang -lSPIRV -lGL -lpthread -ldl
Building compilation database compile_commands.json
progress_finish(["progress_finish"], [])
ld.lld: error: undefined symbol: glslang::TShader::preprocess(TBuiltInResource const*, int, EProfile, bool, bool, EShMessages, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, glslang::TShader::Includer&)
>>> referenced by register_types.cpp:73 (modules/glslang/register_types.cpp:73)
>>>               register_types.linuxbsd.opt.tools.64.llvm.o:(_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)) in archive modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a

ld.lld: error: undefined symbol: glslang::GlslangToSpv(glslang::TIntermediate const&, std::vector<unsigned int, std::allocator<unsigned int> >&, spv::SpvBuildLogger*, glslang::SpvOptions*)
>>> referenced by register_types.cpp:116 (modules/glslang/register_types.cpp:116)
>>>               register_types.linuxbsd.opt.tools.64.llvm.o:(_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)) in archive modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
scons: *** [bin/godot.linuxbsd.opt.tools.64.llvm] Error 1
scons: building terminated because of errors.
 * ERROR: dev-games/godot-9999::gentoo failed (compile phase):
 *   escons failed.
@LinuxUserGD
Copy link
Contributor Author

Possibly related:

-KhronosGroup/glslang#2419 (glslang upstream)
-KhronosGroup/glslang#2283 (glslang upstream)
-godotengine/godot-proposals#1796

Additionally to the mentioned flags above, adding

local cmakeargs=(
        -DBUILD_SHARED_LIBS=ON
        )

to the glslang configure stage with this modified patch (changed STATIC to SHARED)

glslang.patch

From d6e59ca08971c261f8297027d9c274f884c9d1e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= <rverschelde@gmail.com>
Date: Mon, 12 Oct 2020 11:20:05 +0200
Subject: [PATCH 1/2] CMake: Make glslang-default-resource-limits STATIC

---
 StandAlone/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt
index 8038c043..a2009165 100644
--- a/StandAlone/CMakeLists.txt
+++ b/StandAlone/CMakeLists.txt
@@ -31,7 +31,7 @@
 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
-add_library(glslang-default-resource-limits
+add_library(glslang-default-resource-limits SHARED
             ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/resource_limits_c.cpp)
 set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang)
-- 
2.30.0.383.g1c29ac3944.dirty


From 5868365b3a8636a468c4d12b20a221f5b7602de9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= <rverschelde@gmail.com>
Date: Mon, 12 Oct 2020 11:21:05 +0200
Subject: [PATCH 2/2] CMake: Use VERSION/SOVERSION for all shared libs

---
 SPIRV/CMakeLists.txt      | 14 ++++++++++----
 StandAlone/CMakeLists.txt |  7 +++++--
 hlsl/CMakeLists.txt       |  7 +++++--
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt
index d699dadd..55d77c45 100644
--- a/SPIRV/CMakeLists.txt
+++ b/SPIRV/CMakeLists.txt
@@ -69,8 +69,11 @@ set(SPVREMAP_HEADERS
     doc.h)
 
 add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS})
-set_property(TARGET SPIRV PROPERTY FOLDER glslang)
-set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
+set_target_properties(SPIRV PROPERTIES
+    FOLDER glslang
+    POSITION_INDEPENDENT_CODE ON
+    VERSION   "${GLSLANG_VERSION}"
+    SOVERSION "${GLSLANG_VERSION_MAJOR}")
 target_include_directories(SPIRV PUBLIC
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
@@ -79,8 +82,11 @@ glslang_add_build_info_dependency(SPIRV)
 
 if (ENABLE_SPVREMAPPER)
     add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
-    set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
-    set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
+    set_target_properties(SPVRemapper PROPERTIES
+        FOLDER glslang
+        POSITION_INDEPENDENT_CODE ON
+        VERSION   "${GLSLANG_VERSION}"
+        SOVERSION "${GLSLANG_VERSION_MAJOR}")
 endif()
 
 if(WIN32 AND BUILD_SHARED_LIBS)
diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt
index a2009165..6ff5e65b 100644
--- a/StandAlone/CMakeLists.txt
+++ b/StandAlone/CMakeLists.txt
@@ -34,8 +34,11 @@
 add_library(glslang-default-resource-limits STATIC
             ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/resource_limits_c.cpp)
-set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang)
-set_property(TARGET glslang-default-resource-limits PROPERTY POSITION_INDEPENDENT_CODE ON)
+set_target_properties(glslang-default-resource-limits PROPERTIES
+    FOLDER glslang
+    POSITION_INDEPENDENT_CODE ON
+    VERSION   "${GLSLANG_VERSION}"
+    SOVERSION "${GLSLANG_VERSION_MAJOR}")
 
 target_include_directories(glslang-default-resource-limits
                            PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
diff --git a/hlsl/CMakeLists.txt b/hlsl/CMakeLists.txt
index 62faa195..a5472e7e 100644
--- a/hlsl/CMakeLists.txt
+++ b/hlsl/CMakeLists.txt
@@ -38,8 +38,11 @@
 # projects that referenced this target.
 
 add_library(HLSL ${LIB_TYPE} "stub.cpp")
-set_property(TARGET HLSL PROPERTY FOLDER hlsl)
-set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON)
+set_target_properties(HLSL PROPERTIES
+    FOLDER hlsl
+    POSITION_INDEPENDENT_CODE ON
+    VERSION   "${GLSLANG_VERSION}"
+    SOVERSION "${GLSLANG_VERSION_MAJOR}")
 
 if(WIN32 AND BUILD_SHARED_LIBS)
     set_target_properties(HLSL PROPERTIES PREFIX "")
-- 
2.30.0.383.g1c29ac3944.dirty

as a workaround fixes the compilation problem in Godot including linkage.

@akien-mga
Copy link
Member

Can you still reproduce this in the current master branch?

@LinuxUserGD
Copy link
Contributor Author

Can you still reproduce this in the current master branch?

Current master branch compiles fine now with -lglslang, fixed by #56722

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants