XL: Avoid copying archives into shared libraries that link them
The XL toolchain supports shared object files stored in archives. Since CMake lists libraries on link lines by full path it is common for a shared library link line to contain the path to an archive file. When linking a shared library the compiler front-end by default runs CreateExportList to construct the list of symbols to be exported. Unfortunately it passes all files found on the command line to the tool so archive and library files get processed along with the object files. The tool returns a list of all symbols in all objects, archives, and libraries on the command line. This causes the linker to copy every object file out of every archive into the shared library whether they are dependencies of the original object files or not. Work around this problem by running CreateExportList ourselves with just the original object files intended for inclusion in the shared library. Then pass the list it produces on the link line to prevent the compiler front-end from constructing its own. This tells the linker to export only the symbols provided by the original source files of the shared library.
This commit is contained in:
parent
2f3eee7490
commit
d468a2c2cb
|
@ -18,6 +18,12 @@ if(__COMPILER_XL)
|
||||||
endif()
|
endif()
|
||||||
set(__COMPILER_XL 1)
|
set(__COMPILER_XL 1)
|
||||||
|
|
||||||
|
# Find the CreateExportList program that comes with this toolchain.
|
||||||
|
find_program(CMAKE_XL_CreateExportList
|
||||||
|
NAMES CreateExportList
|
||||||
|
DOC "IBM XL CreateExportList tool"
|
||||||
|
)
|
||||||
|
|
||||||
macro(__compiler_xl lang)
|
macro(__compiler_xl lang)
|
||||||
# Feature flags.
|
# Feature flags.
|
||||||
set(CMAKE_${lang}_VERBOSE_FLAG "-V")
|
set(CMAKE_${lang}_VERBOSE_FLAG "-V")
|
||||||
|
@ -28,4 +34,15 @@ macro(__compiler_xl lang)
|
||||||
set(CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT "-g")
|
set(CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT "-g")
|
||||||
set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "<CMAKE_${lang}_COMPILER> <DEFINES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
|
set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "<CMAKE_${lang}_COMPILER> <DEFINES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
|
||||||
set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "<CMAKE_${lang}_COMPILER> <DEFINES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
|
set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "<CMAKE_${lang}_COMPILER> <DEFINES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
|
||||||
|
|
||||||
|
# The compiler front-end passes all object files, archive files, and shared
|
||||||
|
# library files named on the command line to CreateExportList to create a
|
||||||
|
# list of all symbols to be exported from the shared library. This causes
|
||||||
|
# all archive members to be copied into the shared library whether they are
|
||||||
|
# needed or not. Instead we run the tool ourselves to pass only the object
|
||||||
|
# files so that we export only the symbols actually provided by the sources.
|
||||||
|
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
|
||||||
|
"${CMAKE_XL_CreateExportList} <OBJECT_DIR>/objects.exp <OBJECTS>"
|
||||||
|
"<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -Wl,-bE:<OBJECT_DIR>/objects.exp <CMAKE_SHARED_LIBRARY_SONAME_${lang}_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>"
|
||||||
|
)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
Loading…
Reference in New Issue