1// ======================================================== 2// linker_wrapper - Linux Bionic (on the host) 3// ======================================================== 4 5// This is used for bionic on (host) Linux to bootstrap our linker embedded into 6// a binary. 7// 8// Host bionic binaries do not have a PT_INTERP section, instead this gets 9// embedded as the entry point, and the linker is embedded as ELF sections in 10// each binary. There's a linker script that sets all of that up (generated by 11// extract_linker), and defines the extern symbols used in this file. 12cc_object { 13 name: "linker_wrapper", 14 host_supported: true, 15 device_supported: false, 16 target: { 17 linux_bionic: { 18 enabled: true, 19 }, 20 linux_glibc: { 21 enabled: false, 22 }, 23 darwin: { 24 enabled: false, 25 }, 26 }, 27 28 cflags: [ 29 "-fno-stack-protector", 30 "-Wstrict-overflow=5", 31 "-fvisibility=hidden", 32 "-Wall", 33 "-Wextra", 34 "-Wno-unused", 35 "-Werror", 36 ], 37 38 srcs: [ 39 "linker_wrapper.cpp", 40 ], 41 arch: { 42 x86_64: { 43 srcs: ["arch/x86_64/begin.S"], 44 }, 45 }, 46 47 prefix_symbols: "__dlwrap_", 48 49 header_libs: ["libc_headers"], 50 51 // We need to access Bionic private headers in the linker. 52 include_dirs: ["bionic/libc"], 53} 54 55// ======================================================== 56// linker default configuration 57// ======================================================== 58 59// Configuration for the linker binary and any of its static libraries. 60cc_defaults { 61 name: "linker_defaults", 62 arch: { 63 arm: { 64 cflags: ["-D__work_around_b_24465209__"], 65 }, 66 x86: { 67 cflags: ["-D__work_around_b_24465209__"], 68 }, 69 }, 70 71 cflags: [ 72 "-fno-stack-protector", 73 "-Wstrict-overflow=5", 74 "-fvisibility=hidden", 75 "-Wall", 76 "-Wextra", 77 "-Wunused", 78 "-Werror", 79 ], 80 81 // TODO: split out the asflags. 82 asflags: [ 83 "-fno-stack-protector", 84 "-Wstrict-overflow=5", 85 "-fvisibility=hidden", 86 "-Wall", 87 "-Wextra", 88 "-Wunused", 89 "-Werror", 90 ], 91 92 product_variables: { 93 debuggable: { 94 cppflags: ["-DUSE_LD_CONFIG_FILE"], 95 }, 96 }, 97 98 cppflags: ["-Wold-style-cast"], 99 100 static_libs: [ 101 "libziparchive", 102 "libbase", 103 "libz", 104 105 "libasync_safe", 106 107 "liblog", 108 ], 109 110 // We need to access Bionic private headers in the linker. 111 include_dirs: ["bionic/libc"], 112} 113 114// ======================================================== 115// linker components 116// ======================================================== 117 118// Enable a module on all targets the linker runs on (ordinary Android targets, Linux Bionic, and 119// native bridge implementations). 120cc_defaults { 121 name: "linker_all_targets", 122 defaults: ["linux_bionic_supported"], 123 recovery_available: true, 124 native_bridge_supported: true, 125} 126 127cc_library_static { 128 name: "liblinker_main", 129 defaults: ["linker_defaults", "linker_all_targets"], 130 srcs: ["linker_main.cpp"], 131 132 // Ensure that the compiler won't insert string function calls before ifuncs are resolved. 133 cflags: ["-ffreestanding"], 134} 135 136cc_library_static { 137 name: "liblinker_malloc", 138 defaults: ["linker_defaults", "linker_all_targets"], 139 srcs: ["linker_memory.cpp"], 140} 141 142cc_library_static { 143 name: "liblinker_debuggerd_stub", 144 defaults: ["linker_defaults", "linker_all_targets"], 145 srcs: ["linker_debuggerd_stub.cpp"], 146} 147 148// ======================================================== 149// template for the linker binary 150// ======================================================== 151 152filegroup { 153 name: "linker_sources", 154 srcs: [ 155 "dlfcn.cpp", 156 "linker.cpp", 157 "linker_block_allocator.cpp", 158 "linker_dlwarning.cpp", 159 "linker_cfi.cpp", 160 "linker_config.cpp", 161 "linker_debug.cpp", 162 "linker_gdb_support.cpp", 163 "linker_globals.cpp", 164 "linker_libc_support.c", 165 "linker_libcxx_support.cpp", 166 "linker_namespaces.cpp", 167 "linker_logger.cpp", 168 "linker_mapped_file_fragment.cpp", 169 "linker_phdr.cpp", 170 "linker_relocate.cpp", 171 "linker_sdk_versions.cpp", 172 "linker_soinfo.cpp", 173 "linker_tls.cpp", 174 "linker_utils.cpp", 175 "rt.cpp", 176 ], 177} 178 179filegroup { 180 name: "linker_sources_arm", 181 srcs: [ 182 "arch/arm/begin.S", 183 "arch/arm_neon/linker_gnu_hash_neon.cpp", 184 ], 185} 186 187filegroup { 188 name: "linker_sources_arm64", 189 srcs: [ 190 "arch/arm64/begin.S", 191 "arch/arm64/tlsdesc_resolver.S", 192 "arch/arm_neon/linker_gnu_hash_neon.cpp", 193 ], 194} 195 196filegroup { 197 name: "linker_sources_x86", 198 srcs: [ 199 "arch/x86/begin.S", 200 ], 201} 202 203filegroup { 204 name: "linker_sources_x86_64", 205 srcs: [ 206 "arch/x86_64/begin.S", 207 ], 208} 209 210cc_defaults { 211 name: "linker_version_script_overlay", 212 arch: { 213 arm: { version_script: "linker.arm.map" }, 214 arm64: { version_script: "linker.generic.map" }, 215 x86: { version_script: "linker.generic.map" }, 216 x86_64: { version_script: "linker.generic.map" }, 217 }, 218} 219 220// A template for the linker binary. May be inherited by native bridge implementations. 221cc_defaults { 222 name: "linker_bin_template", 223 defaults: ["linker_defaults"], 224 225 srcs: [":linker_sources"], 226 227 arch: { 228 arm: { 229 srcs: [":linker_sources_arm"], 230 static_libs: ["libunwind_llvm"], 231 }, 232 arm64: { 233 srcs: [":linker_sources_arm64"], 234 static_libs: ["libgcc_stripped"], 235 }, 236 x86: { 237 srcs: [":linker_sources_x86"], 238 static_libs: ["libgcc_stripped"], 239 }, 240 x86_64: { 241 srcs: [":linker_sources_x86_64"], 242 static_libs: ["libgcc_stripped"], 243 }, 244 }, 245 246 // -shared is used to overwrite the -Bstatic and -static flags triggered by enabling 247 // static_executable. This dynamic linker is actually a shared object linked with static 248 // libraries. 249 ldflags: [ 250 "-shared", 251 "-Wl,-Bsymbolic", 252 "-Wl,--exclude-libs,ALL", 253 "-Wl,-soname,ld-android.so", 254 ], 255 256 // we are going to link libc++_static manually because 257 // when stl is not set to "none" build system adds libdl 258 // to the list of static libraries which needs to be 259 // avoided in the case of building loader. 260 stl: "none", 261 262 // we don't want crtbegin.o (because we have begin.o), so unset it 263 // just for this module 264 nocrt: true, 265 266 static_executable: true, 267 268 // Leave the symbols in the shared library so that stack unwinders can produce 269 // meaningful name resolution. 270 strip: { 271 keep_symbols: true, 272 }, 273 274 // Insert an extra objcopy step to add prefix to symbols. This is needed to prevent gdb 275 // looking up symbols in the linker by mistake. 276 prefix_symbols: "__dl_", 277 278 sanitize: { 279 hwaddress: false, 280 }, 281 282 static_libs: [ 283 "liblinker_main", 284 "liblinker_malloc", 285 286 "libc++_static", 287 "libc_nomalloc", 288 "libc_dynamic_dispatch", 289 "libm", 290 ], 291 292 // Ensure that if the linker needs __gnu_Unwind_Find_exidx, then the linker will have a 293 // definition of the symbol. The linker links against libgcc.a, whose arm32 unwinder has a weak 294 // reference to __gnu_Unwind_Find_exidx, which isn't sufficient to pull in the strong definition 295 // of __gnu_Unwind_Find_exidx from libc. An unresolved weak reference would create a 296 // non-relative dynamic relocation in the linker binary, which complicates linker startup. 297 // 298 // This line should be unnecessary because the linker's dependency on libunwind_llvm.a should 299 // override libgcc.a, but this line provides a simpler guarantee. It can be removed once the 300 // linker stops linking against libgcc.a's arm32 unwinder. 301 whole_static_libs: ["libc_unwind_static"], 302 303 system_shared_libs: [], 304 305 // Opt out of native_coverage when opting out of system_shared_libs 306 native_coverage: false, 307} 308 309// ======================================================== 310// linker[_asan][64] binary 311// ======================================================== 312 313cc_binary { 314 name: "linker", 315 defaults: [ 316 "linker_bin_template", 317 "linux_bionic_supported", 318 "linker_version_script_overlay", 319 ], 320 321 srcs: [ 322 "linker_translate_path.cpp", 323 ], 324 325 symlinks: ["linker_asan"], 326 multilib: { 327 lib64: { 328 suffix: "64", 329 }, 330 }, 331 332 compile_multilib: "both", 333 334 recovery_available: true, 335 apex_available: [ 336 "//apex_available:platform", 337 "com.android.runtime", 338 ], 339 340 target: { 341 android: { 342 srcs: [ 343 "linker_debuggerd_android.cpp", 344 ], 345 static_libs: [ 346 "libc++demangle", 347 "libdebuggerd_handler_fallback", 348 ], 349 }, 350 linux_bionic: { 351 static_libs: [ 352 "liblinker_debuggerd_stub", 353 ], 354 } 355 }, 356} 357 358// ======================================================== 359// assorted modules 360// ======================================================== 361 362sh_binary { 363 name: "ldd", 364 src: "ldd", 365} 366 367cc_library { 368 // NOTE: --exclude-libs=libgcc.a makes sure that any symbols ld-android.so pulls from 369 // libgcc.a are made static to ld-android.so. This in turn ensures that libraries that 370 // a) pull symbols from libgcc.a and b) depend on ld-android.so will not rely on ld-android.so 371 // to provide those symbols, but will instead pull them from libgcc.a. Specifically, 372 // we use this property to make sure libc.so has its own copy of the code from 373 // libgcc.a it uses. 374 // 375 // DO NOT REMOVE --exclude-libs! 376 377 ldflags: [ 378 "-Wl,--exclude-libs=libgcc.a", 379 "-Wl,--exclude-libs=libgcc_stripped.a", 380 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a", 381 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a", 382 "-Wl,--exclude-libs=libclang_rt.builtins-x86-android.a", 383 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a", 384 ], 385 386 // for x86, exclude libgcc_eh.a for the same reasons as above 387 arch: { 388 x86: { 389 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"], 390 }, 391 x86_64: { 392 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"], 393 }, 394 }, 395 396 srcs: ["ld_android.cpp"], 397 cflags: [ 398 "-Wall", 399 "-Wextra", 400 "-Wunused", 401 "-Werror", 402 ], 403 stl: "none", 404 405 name: "ld-android", 406 defaults: ["linux_bionic_supported", "linker_version_script_overlay"], 407 ramdisk_available: true, 408 recovery_available: true, 409 native_bridge_supported: true, 410 411 nocrt: true, 412 system_shared_libs: [], 413 header_libs: ["libc_headers"], 414 415 // Opt out of native_coverage when opting out of system_shared_libs 416 native_coverage: false, 417 418 sanitize: { 419 never: true, 420 }, 421 422 apex_available: [ 423 "//apex_available:platform", 424 "com.android.runtime", 425 ], 426} 427 428cc_test { 429 name: "linker-unit-tests", 430 431 cflags: [ 432 "-g", 433 "-Wall", 434 "-Wextra", 435 "-Wunused", 436 "-Werror", 437 ], 438 439 // We need to access Bionic private headers in the linker. 440 include_dirs: ["bionic/libc"], 441 442 srcs: [ 443 // Tests. 444 "linker_block_allocator_test.cpp", 445 "linker_config_test.cpp", 446 "linked_list_test.cpp", 447 "linker_sleb128_test.cpp", 448 "linker_utils_test.cpp", 449 "linker_gnu_hash_test.cpp", 450 451 // Parts of the linker that we're testing. 452 "linker_block_allocator.cpp", 453 "linker_config.cpp", 454 "linker_debug.cpp", 455 "linker_test_globals.cpp", 456 "linker_utils.cpp", 457 ], 458 459 static_libs: [ 460 "libasync_safe", 461 "libbase", 462 "liblog", 463 ], 464 465 arch: { 466 arm: { 467 srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], 468 }, 469 arm64: { 470 srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], 471 }, 472 }, 473} 474 475cc_benchmark { 476 name: "linker-benchmarks", 477 478 srcs: [ 479 "linker_gnu_hash_benchmark.cpp", 480 ], 481 482 arch: { 483 arm: { 484 srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], 485 }, 486 arm64: { 487 srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"], 488 }, 489 }, 490} 491