diff options
| author | deshevoy <[email protected]> | 2024-12-17 03:07:08 +0300 |
|---|---|---|
| committer | deshevoy <[email protected]> | 2024-12-17 03:24:08 +0300 |
| commit | fcbdc8d5a1a76c6d7488c2562c805f3e873a2188 (patch) | |
| tree | fd5ad16edba90d2ee3d2888542059d8bcf09be9c | |
| parent | 2513f8020dcbe0c1d82a44ca9b34f31962753ce1 (diff) | |
[build] Add LINK_EXCLUDE_LIBRARIES() macro
This macro could be used to implement a lazy DSO loader
ISSUE:
commit_hash:2a6b9d418cf404d8f742ecab947c3388ef7a8884
| -rw-r--r-- | build/scripts/link_exe.py | 19 | ||||
| -rw-r--r-- | build/ymake.core.conf | 28 |
2 files changed, 45 insertions, 2 deletions
diff --git a/build/scripts/link_exe.py b/build/scripts/link_exe.py index 12f2cb1083f..220beec6125 100644 --- a/build/scripts/link_exe.py +++ b/build/scripts/link_exe.py @@ -275,6 +275,20 @@ def fix_cmd_for_dynamic_cuda(cmd): return flags +def remove_libs(cmd, libs): + excluded_flags = ['-l{}'.format(lib) for lib in libs] + + flags = [] + + for flag in cmd: + if flag in excluded_flags: + continue + + flags.append(flag) + + return flags + + def gen_default_suppressions(inputs, output, source_root): import collections import os @@ -325,6 +339,7 @@ def parse_args(): parser.add_option('--linker-output') parser.add_option('--whole-archive-peers', action='append') parser.add_option('--whole-archive-libs', action='append') + parser.add_option('--exclude-libs', action='append') thinlto_cache.add_options(parser) return parser.parse_args() @@ -347,6 +362,10 @@ if __name__ == '__main__': cuda_manager = CUDAManager(opts.cuda_architectures, opts.nvprune_exe) cmd = process_cuda_libraries_by_nvprune(cmd, cuda_manager, opts.build_root) cmd = process_cuda_libraries_by_objcopy(cmd, opts.build_root, opts.objcopy_exe) + + if opts.exclude_libs: + cmd = remove_libs(cmd, opts.exclude_libs) + cmd = ProcessWholeArchiveOption(opts.arch, opts.whole_archive_peers, opts.whole_archive_libs).construct_cmd(cmd) if opts.custom_step: diff --git a/build/ymake.core.conf b/build/ymake.core.conf index e94764714e6..8978137f2d0 100644 --- a/build/ymake.core.conf +++ b/build/ymake.core.conf @@ -1103,6 +1103,8 @@ module _LINK_UNIT: _BASE_UNIT { LINK_SCRIPT_EXE_FLAGS+=--objcopy-exe $OBJCOPY_TOOL } + LINK_SCRIPT_EXE_FLAGS += ${pre=--exclude-libs :_LINK_EXCLUDE_LIBRARIES_GLOBAL} + when ($OPENSOURCE == "yes" && $AUTOCHECK == "yes") { # FIXME: Replace AUTOCHECK == yes with _not a host platform_ check after YMAKE-218 MODULE_LICENSES_RESTRICTION_TYPES = ALLOW_ONLY @@ -1137,7 +1139,7 @@ macro ADD_CLANG_TIDY() { module _BASE_PROGRAM: _LINK_UNIT { .SYMLINK_POLICY=EXE .ALLOWED=INDUCED_DEPS WHOLE_ARCHIVE - .GLOBAL=LDFLAGS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB + .GLOBAL=LDFLAGS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB _LINK_EXCLUDE_LIBRARIES SET(MODULE_TYPE PROGRAM) SET(MODULE_LANG CPP) FORCE_COVERAGE_ENABLED=yes @@ -1780,7 +1782,7 @@ module _LIBRARY: _BASE_UNIT { .PEERDIR_POLICY=as_include .EXTS=.o .obj .a .mf .supp .sbom .tidyjson .ld .lib .sdcmeta .ALLOWED=GRPC USE_SKIFF EXTRALIBS OBJADDE_GLOBAL RESOURCE_FILES - .GLOBAL=USER_CFLAGS USER_CXXFLAGS USER_CONLYFLAGS LDFLAGS SRCS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB + .GLOBAL=USER_CFLAGS USER_CXXFLAGS USER_CONLYFLAGS LDFLAGS SRCS _WHOLE_ARCHIVE_LIBS_VALUE RPATH OBJADDE_LIB _LINK_EXCLUDE_LIBRARIES .RESTRICTED=ALLOCATOR SIZE TAG DATA TEST_DATA DEPENDS FORK_TESTS FORK_SUBTESTS SPLIT_FACTOR TEST_CWD RUN TIMEOUT SPLIT_DWARF .ALIASES=EXTRALIBS=PY_EXTRALIBS .FINAL_TARGET=no @@ -5858,3 +5860,25 @@ macro TOOLCHAIN(Name) { macro WITHOUT_VERSION() { ENABLE(SKIP_VERSION_REQUIREMENTS) } + +### @usage: LINK_EXCLUDE_LIBRARIES(Libs...) +### +### Exclude specified external dynamic libraries from linker command +### +### May be used to implement shims/mocks, e.g. a lazy loader +### +### @example: +### +### LIBRARY() +### +### SRCS( +### # provide some shim/mock implementation for libcuda.so +### ) +### +### LINK_EXCLUDE_LIBRARIES(cuda) +### +### END() +### +macro LINK_EXCLUDE_LIBRARIES(Libs...) { + SET_APPEND(_LINK_EXCLUDE_LIBRARIES_GLOBAL $Libs) +} |
