ld.conf 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. LDFLAGS+=$USER_LDFLAGS $_LD_FLAGS
  2. LDFLAGS_GLOBAL+=
  3. _START_GROUP=
  4. _END_GROUP=
  5. START_WHOLE_ARCHIVE_VALUE=
  6. END_WHOLE_ARCHIVE_VALUE=
  7. LD_STRIP_FLAG=
  8. _SONAME_OPTION=
  9. _LD_SRCS_GLOBALS=--start-wa ${rootrel;ext=.a:SRCS_GLOBAL} --end-wa ${rootrel;ext=.o:SRCS_GLOBAL} ${rootrel;ext=.supp:SRCS_GLOBAL}
  10. when ($OS_LINUX == "yes" || $OS_ANDROID == "yes" || $OS_CYGWIN == "yes" || $OS_NONE == "yes") {
  11. _START_GROUP=-Wl,--start-group
  12. _END_GROUP=-Wl,--end-group
  13. START_WHOLE_ARCHIVE_VALUE=-Wl,--whole-archive
  14. END_WHOLE_ARCHIVE_VALUE=-Wl,--no-whole-archive
  15. LD_STRIP_FLAG=-s
  16. _SONAME_OPTION=-soname
  17. _LD_SRCS_GLOBALS=-Wl,--whole-archive --ya-start-command-file ${rootrel;ext=.a:SRCS_GLOBAL} --ya-end-command-file -Wl,--no-whole-archive ${rootrel;ext=.o:SRCS_GLOBAL} ${rootrel;ext=.supp:SRCS_GLOBAL}
  18. }
  19. when ($_LD_WHOLE_ARCHIVE == "yes") {
  20. }
  21. when ($OS_DARWIN == "yes" || $OS_IOS == "yes") {
  22. _SONAME_OPTION=-install_name
  23. }
  24. _LD_LINKER_OUTPUT=
  25. _LD_LINKER_OUTPUT_FLAG=--linker-output ${output;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX$MODULE_VERSION.linker.txt:REALPRJNAME}
  26. # Enable section-level DCE (dead code elimination):
  27. # remove whole unused code and data sections
  28. # (needs `-ffunction-sections` and `-fdata-sections` to be useful)
  29. #
  30. # NOTE: CGO linker doesn't seem to support DCE, but shares common LDFLAGS
  31. _LD_DCE_FLAG_GC_SECTIONS=
  32. _LD_DCE_FLAG_PRINT_SECTIONS=
  33. when ($OS_DARWIN == "yes" || $OS_IOS == "yes" || $OS_IOSSIM == "yes") {
  34. _LD_DCE_FLAG_GC_SECTIONS=-Wl,-dead_strip
  35. }
  36. elsewhen ($OS_LINUX == "yes" || $OS_ANDROID == "yes" || $OS_NONE == "yes") {
  37. _LD_DCE_FLAG_GC_SECTIONS=-Wl,--gc-sections
  38. when ($LINKER_DCE_PRINT_SECTIONS == "yes") {
  39. _LD_DCE_FLAG_PRINT_SECTIONS=-Wl,--print-gc-sections
  40. _LD_LINKER_OUTPUT=$_LD_LINKER_OUTPUT_FLAG
  41. }
  42. }
  43. LD_DCE_FLAG =
  44. LD_DCE_FLAG+=$_LD_DCE_FLAG_GC_SECTIONS
  45. LD_DCE_FLAG+=$_LD_DCE_FLAG_PRINT_SECTIONS
  46. DCE_FLAG=
  47. _LD_ICF_FLAG=
  48. _LD_ICF_FLAG_PRINT_SECTIONS=
  49. when ($_DEFAULT_LINKER_ID == "lld") {
  50. # Enable ICF (identical code folding pass) in safe mode
  51. # https://research.google/pubs/pub36912/
  52. _LD_ICF_FLAG=-Wl,--icf=safe
  53. when ($LINKER_ICF_PRINT_SECTIONS == "yes") {
  54. _LD_ICF_FLAG_PRINT_SECTIONS=-Wl,--print-icf-sections
  55. _LD_LINKER_OUTPUT=$_LD_LINKER_OUTPUT_FLAG
  56. }
  57. }
  58. LD_ICF_FLAG =
  59. LD_ICF_FLAG+=$_LD_ICF_FLAG
  60. LD_ICF_FLAG+=$_LD_ICF_FLAG_PRINT_SECTIONS
  61. ICF_FLAG=
  62. STRIP_FLAG=
  63. C_LIBRARY_PATH=
  64. C_SYSTEM_LIBRARIES_INTERCEPT=
  65. when ($USEMPROF == "yes" || $USE_MPROF == "yes") {
  66. C_SYSTEM_LIBRARIES_INTERCEPT+=-ldmalloc
  67. }
  68. _LD_THREAD_LIBRARY=
  69. when ($OS_LINUX == "yes" || $OS_DARWIN == "yes") {
  70. _LD_THREAD_LIBRARY=-lpthread
  71. }
  72. _LD_USE_STDLIB=
  73. when ($_BUILD_COVERAGE == "yes" || $GCOV_COVERAGE == "yes" || $CLANG_COVERAGE == "yes" || $_BUILD_SANITIZED == "yes") {
  74. _LD_USE_STDLIB=
  75. }
  76. elsewhen ($OS_ANDROID == "yes") {
  77. when ($_ANDROID_NDK_VERSION_LESS_THEN_23 == "yes") {
  78. # Preserve old behaviour: specify runtime libs manually
  79. _LD_USE_STDLIB=-nodefaultlibs
  80. }
  81. otherwise {
  82. # Use toolchain defaults to link with libunwind/clang_rt.builtins
  83. _LD_USE_STDLIB=-nostdlib++
  84. }
  85. }
  86. elsewhen ($OS_LINUX == "yes" || $OS_DARWIN == "yes" || $OS_IOS == "yes") {
  87. _LD_USE_STDLIB=-nodefaultlibs
  88. }
  89. _C_SYSTEM_LIBRARIES=$_LD_USE_STDLIB $_LD_THREAD_LIBRARY $_LD_SYS_LIB -lc
  90. when ($MUSL == "yes") {
  91. _C_SYSTEM_LIBRARIES=-nostdlib
  92. }
  93. C_SYSTEM_LIBRARIES=$_C_SYSTEM_LIBRARIES
  94. when ($OS_EMSCRIPTEN == "yes") {
  95. C_SYSTEM_LIBRARIES=-nostdlib
  96. }
  97. OBJADDE=
  98. LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG=
  99. when ($OS_LINUX == "yes" || $OS_ANDROID == "yes") {
  100. LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG=-rdynamic
  101. }
  102. NO_EXPORT_DYNAMIC_SYMBOLS=
  103. EXPORTS_VALUE=$LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG
  104. when ($EXPORTS_FILE) {
  105. EXPORTS_VALUE=$LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG -Wl,--version-script=${input:EXPORTS_FILE}
  106. }
  107. when ($NO_EXPORT_DYNAMIC_SYMBOLS == "yes") {
  108. EXPORTS_VALUE=
  109. }
  110. LINKER_SCRIPT_VALUE=${ext=.ld;pre=-T:SRCS_GLOBAL}
  111. _LINKER_TIME_TRACE_GRANULARITY=500
  112. when ($TIME_TRACE_GRANULARITY && $TIME_TRACE_GRANULARITY != "") {
  113. _LINKER_TIME_TRACE_GRANULARITY=$TIME_TRACE_GRANULARITY
  114. }
  115. _LINKER_TIME_TRACE_FLAG=
  116. when (($TIME_TRACE == "yes" || $LINKER_TIME_TRACE == "yes") && $_DEFAULT_LINKER_ID == "lld") {
  117. _LINKER_TIME_TRACE_FLAG=\
  118. -Wl,--time-trace \
  119. -Wl,--time-trace-granularity=$_LINKER_TIME_TRACE_GRANULARITY \
  120. -Wl,--time-trace-file=${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.time_trace.json:REALPRJNAME}
  121. }
  122. _EXE_FLAGS=\
  123. $C_FLAGS_PLATFORM \
  124. $BEFORE_PEERS \
  125. $_START_GROUP \
  126. ${rootrel:PEERS} \
  127. $_END_GROUP \
  128. $AFTER_PEERS \
  129. $EXPORTS_VALUE \
  130. $LINKER_SCRIPT_VALUE \
  131. $LDFLAGS \
  132. $LDFLAGS_GLOBAL \
  133. $OBJADDE \
  134. $OBJADDE_LIB \
  135. $C_LIBRARY_PATH \
  136. $C_SYSTEM_LIBRARIES_INTERCEPT \
  137. $C_SYSTEM_LIBRARIES \
  138. $STRIP_FLAG \
  139. $DCE_FLAG \
  140. $ICF_FLAG \
  141. $_LINKER_TIME_TRACE_FLAG
  142. _SONAME_FLAG=-Wl,$_SONAME_OPTION,$_SONAME
  143. when ($OS_EMSCRIPTEN == "yes") {
  144. _SONAME_FLAG=
  145. }
  146. _SHARED_FLAG=-shared
  147. when ($OS_EMSCRIPTEN == "yes") {
  148. _SHARED_FLAG=-Wl,-shared -Wl,--no-entry -Wl,--export-all -Wl,--import-memory -Wl,--import-undefined
  149. }
  150. _EXEC_SHARED_FLAG=
  151. when ($OS_LINUX == "yes") {
  152. _EXEC_SHARED_FLAG=-pie -fPIE -Wl,--unresolved-symbols=ignore-all -rdynamic
  153. }
  154. _LD_ENV_STYLE=${cwd:ARCADIA_BUILD_ROOT} $TOOLCHAIN_ENV ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
  155. # Program
  156. GENERATE_MF_CMD=\
  157. $YMAKE_PYTHON ${input:"build/scripts/generate_mf.py"} ${input;hide:"build/scripts/process_command_files.py"} \
  158. --build-root $ARCADIA_BUILD_ROOT \
  159. --module-name $REALPRJNAME \
  160. -o ${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.mf:REALPRJNAME} \
  161. -t $MODULE_TYPE \
  162. --ya-start-command-file \
  163. -Ya,lics $LICENSE_NAMES \
  164. -Ya,peers ${rootrel:PEERS} \
  165. -Ya,credits ${input:CREDITS_TEXTS_FILE} $CREDITS_FLAGS \
  166. --ya-end-command-file
  167. LINK_SCRIPT_EXE_FLAGS=
  168. REAL_LINK_EXE_CMDLINE =\
  169. $YMAKE_PYTHON ${input:"build/scripts/link_exe.py"} \
  170. --source-root $ARCADIA_ROOT
  171. REAL_LINK_EXE_CMDLINE+=$_LD_LINKER_OUTPUT
  172. REAL_LINK_EXE_CMDLINE+=\
  173. ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
  174. ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
  175. $_LD_ARCH_FLAG \
  176. $LINK_SCRIPT_EXE_FLAGS \
  177. $CXX_COMPILER \
  178. $_LD_SRCS_GLOBALS \
  179. $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
  180. $_EXE_FLAGS \
  181. $_PROCESS_WHOLE_ARCHIVE_SCRIPT \
  182. $_LD_ENV_STYLE
  183. REAL_LINK_EXE_TIDY=\
  184. $YMAKE_PYTHON ${input:"build/scripts/clang_tidy_arch.py"} \
  185. --build-root $ARCADIA_BUILD_ROOT \
  186. --source-root $ARCADIA_ROOT \
  187. --output-file $TARGET \
  188. $AUTO_INPUT \
  189. $_LD_ENV_STYLE
  190. # Executable Shared Library
  191. REAL_LINK_EXEC_DYN_LIB_CMDLINE =\
  192. $YMAKE_PYTHON ${input:"build/scripts/link_dyn_lib.py"} \
  193. --target $TARGET
  194. REAL_LINK_EXEC_DYN_LIB_CMDLINE+=$_LD_LINKER_OUTPUT
  195. REAL_LINK_EXEC_DYN_LIB_CMDLINE+=\
  196. ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
  197. ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
  198. $_LD_ARCH_FLAG \
  199. $LINK_DYN_LIB_FLAGS \
  200. $CXX_COMPILER \
  201. $_LD_SRCS_GLOBALS \
  202. $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
  203. $_EXEC_SHARED_FLAG \
  204. $_SONAME_FLAG \
  205. $_EXE_FLAGS \
  206. $_PROCESS_WHOLE_ARCHIVE_SCRIPT \
  207. $_LD_ENV_STYLE
  208. REAL_LINK_EXEC_DYN_LIB=$REAL_LINK_EXEC_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
  209. # Shared Library
  210. LINK_DYN_LIB_FLAGS=
  211. REAL_LINK_DYN_LIB_CMDLINE =\
  212. $YMAKE_PYTHON ${input:"build/scripts/link_dyn_lib.py"} \
  213. --target $TARGET
  214. REAL_LINK_DYN_LIB_CMDLINE+=$_LD_LINKER_OUTPUT
  215. REAL_LINK_DYN_LIB_CMDLINE+=\
  216. ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
  217. ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
  218. $_LD_ARCH_FLAG \
  219. $LINK_DYN_LIB_FLAGS \
  220. $CXX_COMPILER \
  221. $_LD_SRCS_GLOBALS \
  222. $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
  223. $_SHARED_FLAG \
  224. $_SONAME_FLAG \
  225. $_EXE_FLAGS \
  226. $_PROCESS_WHOLE_ARCHIVE_SCRIPT \
  227. $_LD_ENV_STYLE
  228. REAL_LINK_DYN_LIB=$REAL_LINK_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
  229. _DWARF_COMMAND=
  230. when (($OS_DARWIN == "yes" || $OS_IOS || $OS_IOSSIM) && $NO_DEBUGINFO != "yes" && $SPLIT_DWARF_VALUE != "no" && $NO_SPLIT_DWARF != "yes") {
  231. _DWARF_COMMAND=$DWARF_TOOL $TARGET -o ${output;pre=$MODULE_PREFIX$REALPRJNAME.dSYM/Contents/Resources/DWARF/$MODULE_PREFIX:REALPRJNAME} $_LD_ENV_STYLE
  232. }
  233. elsewhen ($OS_DARWIN == "yes" && $NO_DEBUGINFO != "yes") {
  234. _EXE_FLAGS+=$DEBUG_INFO_FLAGS
  235. }
  236. otherwise {
  237. _DWARF_COMMAND=
  238. }
  239. DWARF_COMMAND=$_DWARF_COMMAND
  240. _REAL_LINK_EXE=$REAL_LINK_EXE_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
  241. _LINK_EXE=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_EXE && $DWARF_COMMAND && $LINK_ADDITIONAL_SECTIONS_COMMAND && $PACK_IOS_CMD
  242. _LINK_DYN_LIB=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_DYN_LIB && $DWARF_COMMAND && $LINK_ADDITIONAL_SECTIONS_COMMAND
  243. when ($TIDY == "yes") {
  244. _REAL_LINK_EXE=$REAL_LINK_EXE_TIDY
  245. _LINK_EXE=$REAL_LINK_EXE
  246. _LINK_DYN_LIB=$REAL_LINK_EXE
  247. }
  248. REAL_LINK_EXE=$_REAL_LINK_EXE
  249. LINK_EXE=$_LINK_EXE
  250. LINK_DYN_LIB=$_LINK_DYN_LIB
  251. LINK_EXEC_DYN_LIB=\
  252. $GENERATE_MF && \
  253. $GENERATE_VCS_C_INFO_NODEP && \
  254. $REAL_LINK_EXEC_DYN_LIB && \
  255. $DWARF_COMMAND && \
  256. $LINK_ADDITIONAL_SECTIONS_COMMAND
  257. SWIG_DLL_JAR_CMD=\
  258. $GENERATE_MF && \
  259. $GENERATE_VCS_C_INFO_NODEP && \
  260. $REAL_SWIG_DLL_JAR_CMD && \
  261. $DWARF_COMMAND
  262. _LD_TAIL_LINK_LIB=$AUTO_INPUT ${kv;hide:"p AR"} $TOOLCHAIN_ENV ${kv;hide:"pc light-red"} ${kv;hide:"show_out"}
  263. _LD_ARCHIVER=$YMAKE_PYTHON ${input:"build/scripts/link_lib.py"} ${quo:AR_TOOL} $AR_TYPE $_LD_LLVM_AR_FORMAT $ARCADIA_BUILD_ROOT $_LD_AR_PLUGIN
  264. _LD_LIB_GENERATE_MF=$GENERATE_MF &&
  265. when ($TIDY == "yes") {
  266. _LD_ARCHIVER=$YMAKE_PYTHON ${input:"build/scripts/clang_tidy_arch.py"} --source-root $ARCADIA_ROOT --build-root $ARCADIA_BUILD_ROOT --output-file
  267. _LD_LIB_GENERATE_MF=
  268. }
  269. LINK_LIB=$_LD_LIB_GENERATE_MF $_LD_ARCHIVER $TARGET $_LD_TAIL_LINK_LIB
  270. GLOBAL_LINK_LIB=$_LD_ARCHIVER $GLOBAL_TARGET $_LD_TAIL_LINK_LIB
  271. # "Fat Object" : pre-linked global objects and static library with all dependencies
  272. _LD_LINK_FAT_PREFIX=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $YMAKE_PYTHON ${input:"build/scripts/link_fat_obj.py"} --build-root $ARCADIA_BUILD_ROOT $_PROCESS_WHOLE_ARCHIVE_SCRIPT
  273. _LD_LINK_FAT_SRCS_GLOBALS_WA=$_LD_SRCS_GLOBALS
  274. _LD_LINK_FAT_SRCS_GLOBALS_NO_WA=${rootrel;ext=.a:SRCS_GLOBAL} ${rootrel;ext=.o:SRCS_GLOBAL}
  275. macro _FAT_OBJECT_ARGS_BASE(Flag, Lib) {
  276. .CMD=$Flag=$Lib
  277. }
  278. # FIXME: pre=lib here is weird legacy
  279. _FAT_OBJECT_ARGS=--obj=${pre=lib;output:REALPRJNAME.o}
  280. _LD_LINK_FAT_SRCS_GLOBALS=$_LD_LINK_FAT_SRCS_GLOBALS_WA
  281. macro PACK_GLOBALS_IN_LIBRARY() {
  282. SET(_FAT_OBJECT_ARGS $_FAT_OBJECT_ARGS_BASE(--globals-lib, \${output;pre=$MODULE_PREFIX:REALPRJNAME.globals.a}))
  283. }
  284. when ($OS_ANDROID == "yes") {
  285. _FAT_OBJECT_ARGS=
  286. _LD_LINK_FAT_SRCS_GLOBALS=$_LD_LINK_FAT_SRCS_GLOBALS_NO_WA
  287. }
  288. _LD_LINK_FAT_SUFFIX1=$_LD_ARCH_FLAG \
  289. -Ya,input $AUTO_INPUT $VCS_C_OBJ \
  290. -Ya,global_srcs
  291. _LD_LINK_FAT_SUFFIX2=-Ya,peers $PEERS \
  292. -Ya,linker $CXX_COMPILER \
  293. $LDFLAGS_GLOBAL $C_FLAGS_PLATFORM $LD_SDK_VERSION \
  294. -Ya,archiver $_LD_ARCHIVER \
  295. $TOOLCHAIN_ENV ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
  296. LINK_FAT_OBJECT=\
  297. $_LD_LINK_FAT_PREFIX \
  298. --lib=$TARGET $_FAT_OBJECT_ARGS \
  299. $_LD_LINK_FAT_SUFFIX1 \
  300. $_LD_LINK_FAT_SRCS_GLOBALS \
  301. $_LD_LINK_FAT_SUFFIX2
  302. LINK_RECURSIVE_LIBRARY=\
  303. $_LD_LINK_FAT_PREFIX \
  304. --lib=$TARGET --with-own-obj --with-global-srcs \
  305. $_LD_LINK_FAT_SUFFIX1 \
  306. $_LD_LINK_FAT_SRCS_GLOBALS_NO_WA \
  307. $_LD_LINK_FAT_SUFFIX2
  308. LIBRT=-lrt
  309. MD5LIB=-lcrypt
  310. LIBRESOLV=
  311. when ($OS_LINUX || $OS_DARWIN || $OS_ANDROID) {
  312. LIBRESOLV=-lresolv
  313. }
  314. PROFFLAG=-pg