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