From 678b0f9ce4935aa43c27fcb6c5062f7203acf464 Mon Sep 17 00:00:00 2001 From: Yuwei Xiao Date: Tue, 3 Feb 2026 11:19:12 +0800 Subject: [PATCH 1/4] Support static build & Add -Bsymbolic for loadable extension --- CMakeLists.txt | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d0e5371dd..8e925e5f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -186,25 +186,35 @@ if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/postgres) endif() set(PARAMETERS "-no-warnings") +set(EXTENSION_NAME ${TARGET_NAME}_extension) +set(LOADABLE_EXTENSION_NAME ${TARGET_NAME}_loadable_extension) + +build_static_extension(${TARGET_NAME} ${ALL_OBJECT_FILES} + ${LIBPG_SOURCES_FULLPATH}) build_loadable_extension(${TARGET_NAME} ${PARAMETERS} ${ALL_OBJECT_FILES} ${LIBPG_SOURCES_FULLPATH}) -target_include_directories( - ${TARGET_NAME}_loadable_extension - PRIVATE include postgres/src/include postgres/src/backend - postgres/src/interfaces/libpq ${OPENSSL_INCLUDE_DIR}) - -if(WIN32) - target_include_directories( - ${TARGET_NAME}_loadable_extension - PRIVATE postgres/src/include/port/win32 postgres/src/port - postgres/src/include/port/win32_msvc) +# Fix for ELF symbol conflict when loaded inside PostgreSQL backend +# Use -Bsymbolic to force the extension to prefer its own symbols over global ones +# This fixes the pg_link_canary_is_frontend() check failure where calls from within +# this extension resolve to the backend's version (returns false) instead of ours (returns true) +if(NOT WIN32 AND NOT APPLE) + target_link_options(${LOADABLE_EXTENSION_NAME} PRIVATE + "-Wl,-Bsymbolic" + ) endif() -target_link_libraries(${TARGET_NAME}_loadable_extension ${OPENSSL_LIBRARIES}) -set_property(TARGET ${TARGET_NAME}_loadable_extension PROPERTY C_STANDARD 99) +# Loadable extension needs OpenSSL +target_link_libraries(${LOADABLE_EXTENSION_NAME} ${OPENSSL_LIBRARIES}) if(WIN32) - target_link_libraries(${TARGET_NAME}_loadable_extension wsock32 ws2_32 + target_link_libraries(${LOADABLE_EXTENSION_NAME} wsock32 ws2_32 wldap32 secur32 crypt32) endif() + + +install( + TARGETS ${EXTENSION_NAME} + EXPORT "${DUCKDB_EXPORT_SET}" + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}") From eb824aefe04517e115305bc2ecf2e084d1ae6fbd Mon Sep 17 00:00:00 2001 From: Yuwei Xiao Date: Tue, 3 Feb 2026 12:00:44 +0800 Subject: [PATCH 2/4] minimize changes --- CMakeLists.txt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e925e5f6..f2bec923b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,6 +194,17 @@ build_static_extension(${TARGET_NAME} ${ALL_OBJECT_FILES} build_loadable_extension(${TARGET_NAME} ${PARAMETERS} ${ALL_OBJECT_FILES} ${LIBPG_SOURCES_FULLPATH}) +target_include_directories( + ${LOADABLE_EXTENSION_NAME} + PRIVATE include postgres/src/include postgres/src/backend + postgres/src/interfaces/libpq ${OPENSSL_INCLUDE_DIR}) + +if(WIN32) + target_include_directories( + ${LOADABLE_EXTENSION_NAME} + PRIVATE postgres/src/include/port/win32 postgres/src/port + postgres/src/include/port/win32_msvc) + # Fix for ELF symbol conflict when loaded inside PostgreSQL backend # Use -Bsymbolic to force the extension to prefer its own symbols over global ones # This fixes the pg_link_canary_is_frontend() check failure where calls from within @@ -204,15 +215,14 @@ if(NOT WIN32 AND NOT APPLE) ) endif() -# Loadable extension needs OpenSSL target_link_libraries(${LOADABLE_EXTENSION_NAME} ${OPENSSL_LIBRARIES}) +set_property(TARGET ${LOADABLE_EXTENSION_NAME} PROPERTY C_STANDARD 99) if(WIN32) target_link_libraries(${LOADABLE_EXTENSION_NAME} wsock32 ws2_32 wldap32 secur32 crypt32) endif() - install( TARGETS ${EXTENSION_NAME} EXPORT "${DUCKDB_EXPORT_SET}" From 1d1896ce3f9eb0c79907e7f033ac6b4989423cb6 Mon Sep 17 00:00:00 2001 From: Yuwei Xiao Date: Tue, 3 Feb 2026 14:46:27 +0800 Subject: [PATCH 3/4] cleanup --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2bec923b..61f141ee4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -204,6 +204,7 @@ if(WIN32) ${LOADABLE_EXTENSION_NAME} PRIVATE postgres/src/include/port/win32 postgres/src/port postgres/src/include/port/win32_msvc) +endif() # Fix for ELF symbol conflict when loaded inside PostgreSQL backend # Use -Bsymbolic to force the extension to prefer its own symbols over global ones From 0684e8f70c948b824ac66c8c4b1450b4b1bcd33c Mon Sep 17 00:00:00 2001 From: Yuwei Xiao Date: Wed, 4 Mar 2026 10:22:29 +0800 Subject: [PATCH 4/4] add c99 compiler flag for static build --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61f141ee4..68fc2f5c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,7 @@ if(NOT WIN32 AND NOT APPLE) endif() target_link_libraries(${LOADABLE_EXTENSION_NAME} ${OPENSSL_LIBRARIES}) +set_property(TARGET ${EXTENSION_NAME} PROPERTY C_STANDARD 99) set_property(TARGET ${LOADABLE_EXTENSION_NAME} PROPERTY C_STANDARD 99) if(WIN32)