ld.conf 12 KB

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