xref: /aosp_15_r20/bionic/linker/Android.bp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Workerpackage {
2*8d67ca89SAndroid Build Coastguard Worker    default_team: "trendy_team_native_tools_libraries",
3*8d67ca89SAndroid Build Coastguard Worker    default_applicable_licenses: ["bionic_linker_license"],
4*8d67ca89SAndroid Build Coastguard Worker}
5*8d67ca89SAndroid Build Coastguard Worker
6*8d67ca89SAndroid Build Coastguard Workerlicense {
7*8d67ca89SAndroid Build Coastguard Worker    name: "bionic_linker_license",
8*8d67ca89SAndroid Build Coastguard Worker    visibility: [":__subpackages__"],
9*8d67ca89SAndroid Build Coastguard Worker    license_kinds: [
10*8d67ca89SAndroid Build Coastguard Worker        "SPDX-license-identifier-BSD",
11*8d67ca89SAndroid Build Coastguard Worker    ],
12*8d67ca89SAndroid Build Coastguard Worker    license_text: [
13*8d67ca89SAndroid Build Coastguard Worker        "NOTICE",
14*8d67ca89SAndroid Build Coastguard Worker    ],
15*8d67ca89SAndroid Build Coastguard Worker}
16*8d67ca89SAndroid Build Coastguard Worker
17*8d67ca89SAndroid Build Coastguard Workerlinker_common_flags = [
18*8d67ca89SAndroid Build Coastguard Worker    "-fno-stack-protector",
19*8d67ca89SAndroid Build Coastguard Worker    "-Wstrict-overflow=5",
20*8d67ca89SAndroid Build Coastguard Worker    "-fvisibility=hidden",
21*8d67ca89SAndroid Build Coastguard Worker    "-Wall",
22*8d67ca89SAndroid Build Coastguard Worker    "-Wextra",
23*8d67ca89SAndroid Build Coastguard Worker    "-Wunused",
24*8d67ca89SAndroid Build Coastguard Worker    "-Werror",
25*8d67ca89SAndroid Build Coastguard Worker]
26*8d67ca89SAndroid Build Coastguard Worker
27*8d67ca89SAndroid Build Coastguard Worker// ========================================================
28*8d67ca89SAndroid Build Coastguard Worker// linker_wrapper - Linux Bionic (on the host)
29*8d67ca89SAndroid Build Coastguard Worker// ========================================================
30*8d67ca89SAndroid Build Coastguard Worker
31*8d67ca89SAndroid Build Coastguard Worker// This is used for bionic on (host) Linux to bootstrap our linker embedded into
32*8d67ca89SAndroid Build Coastguard Worker// a binary.
33*8d67ca89SAndroid Build Coastguard Worker//
34*8d67ca89SAndroid Build Coastguard Worker// Host bionic binaries do not have a PT_INTERP section, instead this gets
35*8d67ca89SAndroid Build Coastguard Worker// embedded as the entry point, and the linker is embedded as ELF sections in
36*8d67ca89SAndroid Build Coastguard Worker// each binary. There's a linker script that sets all of that up (generated by
37*8d67ca89SAndroid Build Coastguard Worker// extract_linker), and defines the extern symbols used in this file.
38*8d67ca89SAndroid Build Coastguard Workercc_object {
39*8d67ca89SAndroid Build Coastguard Worker    name: "linker_wrapper",
40*8d67ca89SAndroid Build Coastguard Worker    host_supported: true,
41*8d67ca89SAndroid Build Coastguard Worker    device_supported: false,
42*8d67ca89SAndroid Build Coastguard Worker    enabled: false,
43*8d67ca89SAndroid Build Coastguard Worker    target: {
44*8d67ca89SAndroid Build Coastguard Worker        linux_bionic: {
45*8d67ca89SAndroid Build Coastguard Worker            enabled: true,
46*8d67ca89SAndroid Build Coastguard Worker        },
47*8d67ca89SAndroid Build Coastguard Worker    },
48*8d67ca89SAndroid Build Coastguard Worker
49*8d67ca89SAndroid Build Coastguard Worker    cflags: linker_common_flags,
50*8d67ca89SAndroid Build Coastguard Worker
51*8d67ca89SAndroid Build Coastguard Worker    srcs: [
52*8d67ca89SAndroid Build Coastguard Worker        "linker_wrapper.cpp",
53*8d67ca89SAndroid Build Coastguard Worker    ],
54*8d67ca89SAndroid Build Coastguard Worker    arch: {
55*8d67ca89SAndroid Build Coastguard Worker        arm64: {
56*8d67ca89SAndroid Build Coastguard Worker            srcs: ["arch/arm64/linker_wrapper_begin.S"],
57*8d67ca89SAndroid Build Coastguard Worker        },
58*8d67ca89SAndroid Build Coastguard Worker        riscv64: {
59*8d67ca89SAndroid Build Coastguard Worker            srcs: ["arch/riscv64/linker_wrapper_begin.S"],
60*8d67ca89SAndroid Build Coastguard Worker        },
61*8d67ca89SAndroid Build Coastguard Worker        x86_64: {
62*8d67ca89SAndroid Build Coastguard Worker            srcs: ["arch/x86_64/linker_wrapper_begin.S"],
63*8d67ca89SAndroid Build Coastguard Worker        },
64*8d67ca89SAndroid Build Coastguard Worker    },
65*8d67ca89SAndroid Build Coastguard Worker
66*8d67ca89SAndroid Build Coastguard Worker    header_libs: ["libc_headers"],
67*8d67ca89SAndroid Build Coastguard Worker
68*8d67ca89SAndroid Build Coastguard Worker    // We need to access Bionic private headers in the linker.
69*8d67ca89SAndroid Build Coastguard Worker    include_dirs: ["bionic/libc"],
70*8d67ca89SAndroid Build Coastguard Worker}
71*8d67ca89SAndroid Build Coastguard Worker
72*8d67ca89SAndroid Build Coastguard Worker// ========================================================
73*8d67ca89SAndroid Build Coastguard Worker// linker default configuration
74*8d67ca89SAndroid Build Coastguard Worker// ========================================================
75*8d67ca89SAndroid Build Coastguard Worker
76*8d67ca89SAndroid Build Coastguard Worker// Configuration for the linker binary and any of its static libraries.
77*8d67ca89SAndroid Build Coastguard Workercc_defaults {
78*8d67ca89SAndroid Build Coastguard Worker    name: "linker_defaults",
79*8d67ca89SAndroid Build Coastguard Worker    arch: {
80*8d67ca89SAndroid Build Coastguard Worker        arm: {
81*8d67ca89SAndroid Build Coastguard Worker            cflags: ["-D__work_around_b_24465209__"],
82*8d67ca89SAndroid Build Coastguard Worker        },
83*8d67ca89SAndroid Build Coastguard Worker        x86: {
84*8d67ca89SAndroid Build Coastguard Worker            cflags: ["-D__work_around_b_24465209__"],
85*8d67ca89SAndroid Build Coastguard Worker        },
86*8d67ca89SAndroid Build Coastguard Worker    },
87*8d67ca89SAndroid Build Coastguard Worker
88*8d67ca89SAndroid Build Coastguard Worker    cflags: linker_common_flags,
89*8d67ca89SAndroid Build Coastguard Worker    asflags: linker_common_flags,
90*8d67ca89SAndroid Build Coastguard Worker
91*8d67ca89SAndroid Build Coastguard Worker    product_variables: {
92*8d67ca89SAndroid Build Coastguard Worker        debuggable: {
93*8d67ca89SAndroid Build Coastguard Worker            cppflags: ["-DUSE_LD_CONFIG_FILE"],
94*8d67ca89SAndroid Build Coastguard Worker        },
95*8d67ca89SAndroid Build Coastguard Worker    },
96*8d67ca89SAndroid Build Coastguard Worker
97*8d67ca89SAndroid Build Coastguard Worker    cppflags: ["-Wold-style-cast"],
98*8d67ca89SAndroid Build Coastguard Worker
99*8d67ca89SAndroid Build Coastguard Worker    static_libs: [
100*8d67ca89SAndroid Build Coastguard Worker        "libziparchive",
101*8d67ca89SAndroid Build Coastguard Worker        "libbase",
102*8d67ca89SAndroid Build Coastguard Worker        "libz",
103*8d67ca89SAndroid Build Coastguard Worker
104*8d67ca89SAndroid Build Coastguard Worker        "libasync_safe",
105*8d67ca89SAndroid Build Coastguard Worker
106*8d67ca89SAndroid Build Coastguard Worker        "liblog_for_runtime_apex",
107*8d67ca89SAndroid Build Coastguard Worker    ],
108*8d67ca89SAndroid Build Coastguard Worker
109*8d67ca89SAndroid Build Coastguard Worker    // We need to access Bionic private headers in the linker.
110*8d67ca89SAndroid Build Coastguard Worker    include_dirs: ["bionic/libc"],
111*8d67ca89SAndroid Build Coastguard Worker
112*8d67ca89SAndroid Build Coastguard Worker    sanitize: {
113*8d67ca89SAndroid Build Coastguard Worker        // Supporting memtag_globals in the linker would be tricky,
114*8d67ca89SAndroid Build Coastguard Worker        // because it relocates itself very early.
115*8d67ca89SAndroid Build Coastguard Worker        memtag_globals: false,
116*8d67ca89SAndroid Build Coastguard Worker    },
117*8d67ca89SAndroid Build Coastguard Worker}
118*8d67ca89SAndroid Build Coastguard Worker
119*8d67ca89SAndroid Build Coastguard Worker// ========================================================
120*8d67ca89SAndroid Build Coastguard Worker// linker components
121*8d67ca89SAndroid Build Coastguard Worker// ========================================================
122*8d67ca89SAndroid Build Coastguard Worker
123*8d67ca89SAndroid Build Coastguard Worker// Enable a module on all targets the linker runs on (ordinary Android targets, Linux Bionic, and
124*8d67ca89SAndroid Build Coastguard Worker// native bridge implementations).
125*8d67ca89SAndroid Build Coastguard Workercc_defaults {
126*8d67ca89SAndroid Build Coastguard Worker    name: "linker_all_targets",
127*8d67ca89SAndroid Build Coastguard Worker    defaults: ["linux_bionic_supported"],
128*8d67ca89SAndroid Build Coastguard Worker    recovery_available: true,
129*8d67ca89SAndroid Build Coastguard Worker    vendor_ramdisk_available: true,
130*8d67ca89SAndroid Build Coastguard Worker    native_bridge_supported: true,
131*8d67ca89SAndroid Build Coastguard Worker}
132*8d67ca89SAndroid Build Coastguard Worker
133*8d67ca89SAndroid Build Coastguard Workercc_library_static {
134*8d67ca89SAndroid Build Coastguard Worker    name: "liblinker_main",
135*8d67ca89SAndroid Build Coastguard Worker    defaults: [
136*8d67ca89SAndroid Build Coastguard Worker        "linker_defaults",
137*8d67ca89SAndroid Build Coastguard Worker        "linker_all_targets",
138*8d67ca89SAndroid Build Coastguard Worker    ],
139*8d67ca89SAndroid Build Coastguard Worker    srcs: ["linker_main.cpp"],
140*8d67ca89SAndroid Build Coastguard Worker
141*8d67ca89SAndroid Build Coastguard Worker    // Ensure that the compiler won't insert string function calls before ifuncs are resolved.
142*8d67ca89SAndroid Build Coastguard Worker    cflags: ["-ffreestanding"],
143*8d67ca89SAndroid Build Coastguard Worker    apex_available: [
144*8d67ca89SAndroid Build Coastguard Worker        "com.android.runtime",
145*8d67ca89SAndroid Build Coastguard Worker    ],
146*8d67ca89SAndroid Build Coastguard Worker}
147*8d67ca89SAndroid Build Coastguard Worker
148*8d67ca89SAndroid Build Coastguard Workercc_library_static {
149*8d67ca89SAndroid Build Coastguard Worker    name: "liblinker_malloc",
150*8d67ca89SAndroid Build Coastguard Worker    defaults: [
151*8d67ca89SAndroid Build Coastguard Worker        "linker_defaults",
152*8d67ca89SAndroid Build Coastguard Worker        "linker_all_targets",
153*8d67ca89SAndroid Build Coastguard Worker    ],
154*8d67ca89SAndroid Build Coastguard Worker    srcs: ["linker_memory.cpp"],
155*8d67ca89SAndroid Build Coastguard Worker    apex_available: [
156*8d67ca89SAndroid Build Coastguard Worker        "com.android.runtime",
157*8d67ca89SAndroid Build Coastguard Worker    ],
158*8d67ca89SAndroid Build Coastguard Worker}
159*8d67ca89SAndroid Build Coastguard Worker
160*8d67ca89SAndroid Build Coastguard Workercc_library_static {
161*8d67ca89SAndroid Build Coastguard Worker    name: "liblinker_debuggerd_stub",
162*8d67ca89SAndroid Build Coastguard Worker    defaults: [
163*8d67ca89SAndroid Build Coastguard Worker        "linker_defaults",
164*8d67ca89SAndroid Build Coastguard Worker        "linker_all_targets",
165*8d67ca89SAndroid Build Coastguard Worker    ],
166*8d67ca89SAndroid Build Coastguard Worker    srcs: ["linker_debuggerd_stub.cpp"],
167*8d67ca89SAndroid Build Coastguard Worker}
168*8d67ca89SAndroid Build Coastguard Worker
169*8d67ca89SAndroid Build Coastguard Worker// ========================================================
170*8d67ca89SAndroid Build Coastguard Worker// template for the linker binary
171*8d67ca89SAndroid Build Coastguard Worker// ========================================================
172*8d67ca89SAndroid Build Coastguard Worker
173*8d67ca89SAndroid Build Coastguard Workerfilegroup {
174*8d67ca89SAndroid Build Coastguard Worker    name: "linker_sources",
175*8d67ca89SAndroid Build Coastguard Worker    srcs: [
176*8d67ca89SAndroid Build Coastguard Worker        "dlfcn.cpp",
177*8d67ca89SAndroid Build Coastguard Worker        "linker.cpp",
178*8d67ca89SAndroid Build Coastguard Worker        "linker_auxv.cpp",
179*8d67ca89SAndroid Build Coastguard Worker        "linker_block_allocator.cpp",
180*8d67ca89SAndroid Build Coastguard Worker        "linker_dlwarning.cpp",
181*8d67ca89SAndroid Build Coastguard Worker        "linker_cfi.cpp",
182*8d67ca89SAndroid Build Coastguard Worker        "linker_config.cpp",
183*8d67ca89SAndroid Build Coastguard Worker        "linker_debug.cpp",
184*8d67ca89SAndroid Build Coastguard Worker        "linker_gdb_support.cpp",
185*8d67ca89SAndroid Build Coastguard Worker        "linker_globals.cpp",
186*8d67ca89SAndroid Build Coastguard Worker        "linker_libc_support.c",
187*8d67ca89SAndroid Build Coastguard Worker        "linker_libcxx_support.cpp",
188*8d67ca89SAndroid Build Coastguard Worker        "linker_namespaces.cpp",
189*8d67ca89SAndroid Build Coastguard Worker        "linker_logger.cpp",
190*8d67ca89SAndroid Build Coastguard Worker        "linker_mapped_file_fragment.cpp",
191*8d67ca89SAndroid Build Coastguard Worker        "linker_note_gnu_property.cpp",
192*8d67ca89SAndroid Build Coastguard Worker        "linker_phdr.cpp",
193*8d67ca89SAndroid Build Coastguard Worker        "linker_phdr_16kib_compat.cpp",
194*8d67ca89SAndroid Build Coastguard Worker        "linker_relocate.cpp",
195*8d67ca89SAndroid Build Coastguard Worker        "linker_sdk_versions.cpp",
196*8d67ca89SAndroid Build Coastguard Worker        "linker_soinfo.cpp",
197*8d67ca89SAndroid Build Coastguard Worker        "linker_transparent_hugepage_support.cpp",
198*8d67ca89SAndroid Build Coastguard Worker        "linker_tls.cpp",
199*8d67ca89SAndroid Build Coastguard Worker        "linker_utils.cpp",
200*8d67ca89SAndroid Build Coastguard Worker        "rt.cpp",
201*8d67ca89SAndroid Build Coastguard Worker    ],
202*8d67ca89SAndroid Build Coastguard Worker}
203*8d67ca89SAndroid Build Coastguard Worker
204*8d67ca89SAndroid Build Coastguard Workerfilegroup {
205*8d67ca89SAndroid Build Coastguard Worker    name: "linker_sources_arm",
206*8d67ca89SAndroid Build Coastguard Worker    srcs: [
207*8d67ca89SAndroid Build Coastguard Worker        "arch/arm/begin.S",
208*8d67ca89SAndroid Build Coastguard Worker        "arch/arm_neon/linker_gnu_hash_neon.cpp",
209*8d67ca89SAndroid Build Coastguard Worker    ],
210*8d67ca89SAndroid Build Coastguard Worker}
211*8d67ca89SAndroid Build Coastguard Worker
212*8d67ca89SAndroid Build Coastguard Workerfilegroup {
213*8d67ca89SAndroid Build Coastguard Worker    name: "linker_sources_arm64",
214*8d67ca89SAndroid Build Coastguard Worker    srcs: [
215*8d67ca89SAndroid Build Coastguard Worker        "arch/arm64/begin.S",
216*8d67ca89SAndroid Build Coastguard Worker        "arch/arm64/tlsdesc_resolver.S",
217*8d67ca89SAndroid Build Coastguard Worker        "arch/arm_neon/linker_gnu_hash_neon.cpp",
218*8d67ca89SAndroid Build Coastguard Worker    ],
219*8d67ca89SAndroid Build Coastguard Worker}
220*8d67ca89SAndroid Build Coastguard Worker
221*8d67ca89SAndroid Build Coastguard Workerfilegroup {
222*8d67ca89SAndroid Build Coastguard Worker    name: "linker_sources_riscv64",
223*8d67ca89SAndroid Build Coastguard Worker    srcs: [
224*8d67ca89SAndroid Build Coastguard Worker        "arch/riscv64/begin.S",
225*8d67ca89SAndroid Build Coastguard Worker        "arch/riscv64/tlsdesc_resolver.S",
226*8d67ca89SAndroid Build Coastguard Worker    ],
227*8d67ca89SAndroid Build Coastguard Worker}
228*8d67ca89SAndroid Build Coastguard Worker
229*8d67ca89SAndroid Build Coastguard Workerfilegroup {
230*8d67ca89SAndroid Build Coastguard Worker    name: "linker_sources_x86",
231*8d67ca89SAndroid Build Coastguard Worker    srcs: [
232*8d67ca89SAndroid Build Coastguard Worker        "arch/x86/begin.S",
233*8d67ca89SAndroid Build Coastguard Worker    ],
234*8d67ca89SAndroid Build Coastguard Worker}
235*8d67ca89SAndroid Build Coastguard Worker
236*8d67ca89SAndroid Build Coastguard Workerfilegroup {
237*8d67ca89SAndroid Build Coastguard Worker    name: "linker_sources_x86_64",
238*8d67ca89SAndroid Build Coastguard Worker    srcs: [
239*8d67ca89SAndroid Build Coastguard Worker        "arch/x86_64/begin.S",
240*8d67ca89SAndroid Build Coastguard Worker    ],
241*8d67ca89SAndroid Build Coastguard Worker}
242*8d67ca89SAndroid Build Coastguard Worker
243*8d67ca89SAndroid Build Coastguard Workercc_defaults {
244*8d67ca89SAndroid Build Coastguard Worker    name: "linker_version_script_overlay",
245*8d67ca89SAndroid Build Coastguard Worker    arch: {
246*8d67ca89SAndroid Build Coastguard Worker        arm: {
247*8d67ca89SAndroid Build Coastguard Worker            version_script: "linker.arm.map",
248*8d67ca89SAndroid Build Coastguard Worker        },
249*8d67ca89SAndroid Build Coastguard Worker        arm64: {
250*8d67ca89SAndroid Build Coastguard Worker            version_script: "linker.generic.map",
251*8d67ca89SAndroid Build Coastguard Worker        },
252*8d67ca89SAndroid Build Coastguard Worker        riscv64: {
253*8d67ca89SAndroid Build Coastguard Worker            version_script: "linker.generic.map",
254*8d67ca89SAndroid Build Coastguard Worker        },
255*8d67ca89SAndroid Build Coastguard Worker        x86: {
256*8d67ca89SAndroid Build Coastguard Worker            version_script: "linker.generic.map",
257*8d67ca89SAndroid Build Coastguard Worker        },
258*8d67ca89SAndroid Build Coastguard Worker        x86_64: {
259*8d67ca89SAndroid Build Coastguard Worker            version_script: "linker.generic.map",
260*8d67ca89SAndroid Build Coastguard Worker        },
261*8d67ca89SAndroid Build Coastguard Worker    },
262*8d67ca89SAndroid Build Coastguard Worker}
263*8d67ca89SAndroid Build Coastguard Worker
264*8d67ca89SAndroid Build Coastguard Worker// A template for the linker binary. May be inherited by native bridge implementations.
265*8d67ca89SAndroid Build Coastguard Workercc_defaults {
266*8d67ca89SAndroid Build Coastguard Worker    name: "linker_bin_template",
267*8d67ca89SAndroid Build Coastguard Worker    defaults: [
268*8d67ca89SAndroid Build Coastguard Worker        "linker_defaults",
269*8d67ca89SAndroid Build Coastguard Worker        "keep_symbols",
270*8d67ca89SAndroid Build Coastguard Worker    ],
271*8d67ca89SAndroid Build Coastguard Worker
272*8d67ca89SAndroid Build Coastguard Worker    srcs: [":linker_sources"],
273*8d67ca89SAndroid Build Coastguard Worker
274*8d67ca89SAndroid Build Coastguard Worker    arch: {
275*8d67ca89SAndroid Build Coastguard Worker        arm: {
276*8d67ca89SAndroid Build Coastguard Worker            srcs: [":linker_sources_arm"],
277*8d67ca89SAndroid Build Coastguard Worker        },
278*8d67ca89SAndroid Build Coastguard Worker        arm64: {
279*8d67ca89SAndroid Build Coastguard Worker            srcs: [":linker_sources_arm64"],
280*8d67ca89SAndroid Build Coastguard Worker        },
281*8d67ca89SAndroid Build Coastguard Worker        riscv64: {
282*8d67ca89SAndroid Build Coastguard Worker            srcs: [":linker_sources_riscv64"],
283*8d67ca89SAndroid Build Coastguard Worker        },
284*8d67ca89SAndroid Build Coastguard Worker        x86: {
285*8d67ca89SAndroid Build Coastguard Worker            srcs: [":linker_sources_x86"],
286*8d67ca89SAndroid Build Coastguard Worker        },
287*8d67ca89SAndroid Build Coastguard Worker        x86_64: {
288*8d67ca89SAndroid Build Coastguard Worker            srcs: [":linker_sources_x86_64"],
289*8d67ca89SAndroid Build Coastguard Worker        },
290*8d67ca89SAndroid Build Coastguard Worker    },
291*8d67ca89SAndroid Build Coastguard Worker
292*8d67ca89SAndroid Build Coastguard Worker    static_executable: true,
293*8d67ca89SAndroid Build Coastguard Worker
294*8d67ca89SAndroid Build Coastguard Worker    // -shared is used to overwrite the -Bstatic and -static flags triggered by enabling
295*8d67ca89SAndroid Build Coastguard Worker    // static_executable. The dynamic linker is actually a shared object linked with static
296*8d67ca89SAndroid Build Coastguard Worker    // libraries.
297*8d67ca89SAndroid Build Coastguard Worker    ldflags: [
298*8d67ca89SAndroid Build Coastguard Worker        "-shared",
299*8d67ca89SAndroid Build Coastguard Worker        "-Wl,-Bsymbolic",
300*8d67ca89SAndroid Build Coastguard Worker        "-Wl,--exclude-libs,ALL",
301*8d67ca89SAndroid Build Coastguard Worker        "-Wl,-soname,ld-android.so",
302*8d67ca89SAndroid Build Coastguard Worker        // When the linker applies its own IRELATIVE relocations, it will only read DT_REL[A] and
303*8d67ca89SAndroid Build Coastguard Worker        // DT_JMPREL, not DT_ANDROID_REL[A], which can also theoretically contain IRELATIVE
304*8d67ca89SAndroid Build Coastguard Worker        // relocations. lld has been taught to not store them there as a bug workaround (see
305*8d67ca89SAndroid Build Coastguard Worker        // https://llvm.org/pr86751) but the workaround could be removed at some point in the
306*8d67ca89SAndroid Build Coastguard Worker        // future. So we explicitly prevent it from doing so by disabling DT_ANDROID_REL[A] when
307*8d67ca89SAndroid Build Coastguard Worker        // linking the linker (DT_RELR cannot encode IRELATIVE relocations).
308*8d67ca89SAndroid Build Coastguard Worker        "-Wl,--pack-dyn-relocs=relr",
309*8d67ca89SAndroid Build Coastguard Worker    ],
310*8d67ca89SAndroid Build Coastguard Worker
311*8d67ca89SAndroid Build Coastguard Worker    // We link libc++_static manually because otherwise the build system will
312*8d67ca89SAndroid Build Coastguard Worker    // automatically add libdl to the list of static libraries.
313*8d67ca89SAndroid Build Coastguard Worker    stl: "none",
314*8d67ca89SAndroid Build Coastguard Worker
315*8d67ca89SAndroid Build Coastguard Worker    // We don't want crtbegin.o (because we have our own arch/*/begin.o),
316*8d67ca89SAndroid Build Coastguard Worker    // so unset it just for this module.
317*8d67ca89SAndroid Build Coastguard Worker    nocrt: true,
318*8d67ca89SAndroid Build Coastguard Worker
319*8d67ca89SAndroid Build Coastguard Worker    // Insert an extra objcopy step to add prefix to symbols. This is needed to prevent gdb
320*8d67ca89SAndroid Build Coastguard Worker    // looking up symbols in the linker by mistake.
321*8d67ca89SAndroid Build Coastguard Worker    prefix_symbols: "__dl_",
322*8d67ca89SAndroid Build Coastguard Worker
323*8d67ca89SAndroid Build Coastguard Worker    sanitize: {
324*8d67ca89SAndroid Build Coastguard Worker        hwaddress: false,
325*8d67ca89SAndroid Build Coastguard Worker        memtag_stack: false,
326*8d67ca89SAndroid Build Coastguard Worker    },
327*8d67ca89SAndroid Build Coastguard Worker
328*8d67ca89SAndroid Build Coastguard Worker    static_libs: [
329*8d67ca89SAndroid Build Coastguard Worker        "liblinker_main",
330*8d67ca89SAndroid Build Coastguard Worker        "liblinker_malloc",
331*8d67ca89SAndroid Build Coastguard Worker
332*8d67ca89SAndroid Build Coastguard Worker        // We use a version of libc++ built without exceptions,
333*8d67ca89SAndroid Build Coastguard Worker        // because accessing EH globals uses ELF TLS,
334*8d67ca89SAndroid Build Coastguard Worker        // which is not supported in the loader.
335*8d67ca89SAndroid Build Coastguard Worker        "libc++_static_noexcept",
336*8d67ca89SAndroid Build Coastguard Worker
337*8d67ca89SAndroid Build Coastguard Worker        "libc_nomalloc",
338*8d67ca89SAndroid Build Coastguard Worker        "libc_dynamic_dispatch",
339*8d67ca89SAndroid Build Coastguard Worker        "libm",
340*8d67ca89SAndroid Build Coastguard Worker        "libunwind",
341*8d67ca89SAndroid Build Coastguard Worker    ],
342*8d67ca89SAndroid Build Coastguard Worker
343*8d67ca89SAndroid Build Coastguard Worker    system_shared_libs: [],
344*8d67ca89SAndroid Build Coastguard Worker
345*8d67ca89SAndroid Build Coastguard Worker    // Opt out of native_coverage when opting out of system_shared_libs
346*8d67ca89SAndroid Build Coastguard Worker    native_coverage: false,
347*8d67ca89SAndroid Build Coastguard Worker}
348*8d67ca89SAndroid Build Coastguard Worker
349*8d67ca89SAndroid Build Coastguard Worker// ========================================================
350*8d67ca89SAndroid Build Coastguard Worker// linker[_asan][64] binary
351*8d67ca89SAndroid Build Coastguard Worker// ========================================================
352*8d67ca89SAndroid Build Coastguard Worker
353*8d67ca89SAndroid Build Coastguard Workercc_binary {
354*8d67ca89SAndroid Build Coastguard Worker    name: "linker",
355*8d67ca89SAndroid Build Coastguard Worker    defaults: [
356*8d67ca89SAndroid Build Coastguard Worker        "linker_bin_template",
357*8d67ca89SAndroid Build Coastguard Worker        "linux_bionic_supported",
358*8d67ca89SAndroid Build Coastguard Worker        "linker_version_script_overlay",
359*8d67ca89SAndroid Build Coastguard Worker    ],
360*8d67ca89SAndroid Build Coastguard Worker
361*8d67ca89SAndroid Build Coastguard Worker    srcs: [
362*8d67ca89SAndroid Build Coastguard Worker        "linker_translate_path.cpp",
363*8d67ca89SAndroid Build Coastguard Worker    ],
364*8d67ca89SAndroid Build Coastguard Worker
365*8d67ca89SAndroid Build Coastguard Worker    symlinks: ["linker_asan"],
366*8d67ca89SAndroid Build Coastguard Worker    arch: {
367*8d67ca89SAndroid Build Coastguard Worker        arm64: {
368*8d67ca89SAndroid Build Coastguard Worker            symlinks: ["linker_hwasan"],
369*8d67ca89SAndroid Build Coastguard Worker        },
370*8d67ca89SAndroid Build Coastguard Worker    },
371*8d67ca89SAndroid Build Coastguard Worker    multilib: {
372*8d67ca89SAndroid Build Coastguard Worker        lib64: {
373*8d67ca89SAndroid Build Coastguard Worker            suffix: "64",
374*8d67ca89SAndroid Build Coastguard Worker        },
375*8d67ca89SAndroid Build Coastguard Worker    },
376*8d67ca89SAndroid Build Coastguard Worker
377*8d67ca89SAndroid Build Coastguard Worker    compile_multilib: "both",
378*8d67ca89SAndroid Build Coastguard Worker
379*8d67ca89SAndroid Build Coastguard Worker    recovery_available: true,
380*8d67ca89SAndroid Build Coastguard Worker    vendor_ramdisk_available: true,
381*8d67ca89SAndroid Build Coastguard Worker    apex_available: [
382*8d67ca89SAndroid Build Coastguard Worker        "//apex_available:platform",
383*8d67ca89SAndroid Build Coastguard Worker        "com.android.runtime",
384*8d67ca89SAndroid Build Coastguard Worker    ],
385*8d67ca89SAndroid Build Coastguard Worker
386*8d67ca89SAndroid Build Coastguard Worker    target: {
387*8d67ca89SAndroid Build Coastguard Worker        android: {
388*8d67ca89SAndroid Build Coastguard Worker            srcs: [
389*8d67ca89SAndroid Build Coastguard Worker                "linker_debuggerd_android.cpp",
390*8d67ca89SAndroid Build Coastguard Worker            ],
391*8d67ca89SAndroid Build Coastguard Worker            static_libs: [
392*8d67ca89SAndroid Build Coastguard Worker                "libc++demangle_noexcept",
393*8d67ca89SAndroid Build Coastguard Worker                "libdebuggerd_handler_fallback",
394*8d67ca89SAndroid Build Coastguard Worker            ],
395*8d67ca89SAndroid Build Coastguard Worker        },
396*8d67ca89SAndroid Build Coastguard Worker        linux_bionic: {
397*8d67ca89SAndroid Build Coastguard Worker            static_libs: [
398*8d67ca89SAndroid Build Coastguard Worker                "liblinker_debuggerd_stub",
399*8d67ca89SAndroid Build Coastguard Worker            ],
400*8d67ca89SAndroid Build Coastguard Worker        },
401*8d67ca89SAndroid Build Coastguard Worker    },
402*8d67ca89SAndroid Build Coastguard Worker
403*8d67ca89SAndroid Build Coastguard Worker    afdo: true,
404*8d67ca89SAndroid Build Coastguard Worker}
405*8d67ca89SAndroid Build Coastguard Worker
406*8d67ca89SAndroid Build Coastguard Worker// ========================================================
407*8d67ca89SAndroid Build Coastguard Worker// assorted modules
408*8d67ca89SAndroid Build Coastguard Worker// ========================================================
409*8d67ca89SAndroid Build Coastguard Worker
410*8d67ca89SAndroid Build Coastguard Workersh_binary {
411*8d67ca89SAndroid Build Coastguard Worker    name: "ldd",
412*8d67ca89SAndroid Build Coastguard Worker    src: "ldd.sh",
413*8d67ca89SAndroid Build Coastguard Worker}
414*8d67ca89SAndroid Build Coastguard Worker
415*8d67ca89SAndroid Build Coastguard Worker// Used to generate binaries that can be backed by transparent hugepages.
416*8d67ca89SAndroid Build Coastguard Workercc_defaults {
417*8d67ca89SAndroid Build Coastguard Worker    name: "linker_hugepage_aligned",
418*8d67ca89SAndroid Build Coastguard Worker    arch: {
419*8d67ca89SAndroid Build Coastguard Worker        arm64: {
420*8d67ca89SAndroid Build Coastguard Worker            ldflags: ["-z max-page-size=0x200000"],
421*8d67ca89SAndroid Build Coastguard Worker        },
422*8d67ca89SAndroid Build Coastguard Worker        x86_64: {
423*8d67ca89SAndroid Build Coastguard Worker            ldflags: ["-z max-page-size=0x200000"],
424*8d67ca89SAndroid Build Coastguard Worker        },
425*8d67ca89SAndroid Build Coastguard Worker    },
426*8d67ca89SAndroid Build Coastguard Worker}
427*8d67ca89SAndroid Build Coastguard Worker
428*8d67ca89SAndroid Build Coastguard Workercc_library {
429*8d67ca89SAndroid Build Coastguard Worker    srcs: ["ld_android.cpp"],
430*8d67ca89SAndroid Build Coastguard Worker    cflags: [
431*8d67ca89SAndroid Build Coastguard Worker        "-Wall",
432*8d67ca89SAndroid Build Coastguard Worker        "-Wextra",
433*8d67ca89SAndroid Build Coastguard Worker        "-Wunused",
434*8d67ca89SAndroid Build Coastguard Worker        "-Werror",
435*8d67ca89SAndroid Build Coastguard Worker    ],
436*8d67ca89SAndroid Build Coastguard Worker    stl: "none",
437*8d67ca89SAndroid Build Coastguard Worker
438*8d67ca89SAndroid Build Coastguard Worker    name: "ld-android",
439*8d67ca89SAndroid Build Coastguard Worker    defaults: [
440*8d67ca89SAndroid Build Coastguard Worker        "linux_bionic_supported",
441*8d67ca89SAndroid Build Coastguard Worker        "linker_version_script_overlay",
442*8d67ca89SAndroid Build Coastguard Worker    ],
443*8d67ca89SAndroid Build Coastguard Worker    ramdisk_available: true,
444*8d67ca89SAndroid Build Coastguard Worker    vendor_ramdisk_available: true,
445*8d67ca89SAndroid Build Coastguard Worker    recovery_available: true,
446*8d67ca89SAndroid Build Coastguard Worker    native_bridge_supported: true,
447*8d67ca89SAndroid Build Coastguard Worker
448*8d67ca89SAndroid Build Coastguard Worker    nocrt: true,
449*8d67ca89SAndroid Build Coastguard Worker    system_shared_libs: [],
450*8d67ca89SAndroid Build Coastguard Worker    header_libs: ["libc_headers"],
451*8d67ca89SAndroid Build Coastguard Worker
452*8d67ca89SAndroid Build Coastguard Worker    // Opt out of native_coverage when opting out of system_shared_libs
453*8d67ca89SAndroid Build Coastguard Worker    native_coverage: false,
454*8d67ca89SAndroid Build Coastguard Worker
455*8d67ca89SAndroid Build Coastguard Worker    sanitize: {
456*8d67ca89SAndroid Build Coastguard Worker        never: true,
457*8d67ca89SAndroid Build Coastguard Worker    },
458*8d67ca89SAndroid Build Coastguard Worker
459*8d67ca89SAndroid Build Coastguard Worker    apex_available: [
460*8d67ca89SAndroid Build Coastguard Worker        "//apex_available:platform",
461*8d67ca89SAndroid Build Coastguard Worker        "com.android.runtime",
462*8d67ca89SAndroid Build Coastguard Worker    ],
463*8d67ca89SAndroid Build Coastguard Worker}
464*8d67ca89SAndroid Build Coastguard Worker
465*8d67ca89SAndroid Build Coastguard Workercc_test {
466*8d67ca89SAndroid Build Coastguard Worker    name: "linker-unit-tests",
467*8d67ca89SAndroid Build Coastguard Worker    test_suites: ["device-tests"],
468*8d67ca89SAndroid Build Coastguard Worker
469*8d67ca89SAndroid Build Coastguard Worker    cflags: [
470*8d67ca89SAndroid Build Coastguard Worker        "-g",
471*8d67ca89SAndroid Build Coastguard Worker        "-Wall",
472*8d67ca89SAndroid Build Coastguard Worker        "-Wextra",
473*8d67ca89SAndroid Build Coastguard Worker        "-Wunused",
474*8d67ca89SAndroid Build Coastguard Worker        "-Werror",
475*8d67ca89SAndroid Build Coastguard Worker    ],
476*8d67ca89SAndroid Build Coastguard Worker
477*8d67ca89SAndroid Build Coastguard Worker    // We need to access Bionic private headers in the linker.
478*8d67ca89SAndroid Build Coastguard Worker    include_dirs: ["bionic/libc"],
479*8d67ca89SAndroid Build Coastguard Worker
480*8d67ca89SAndroid Build Coastguard Worker    srcs: [
481*8d67ca89SAndroid Build Coastguard Worker        // Tests.
482*8d67ca89SAndroid Build Coastguard Worker        "linker_block_allocator_test.cpp",
483*8d67ca89SAndroid Build Coastguard Worker        "linker_config_test.cpp",
484*8d67ca89SAndroid Build Coastguard Worker        "linked_list_test.cpp",
485*8d67ca89SAndroid Build Coastguard Worker        "linker_note_gnu_property_test.cpp",
486*8d67ca89SAndroid Build Coastguard Worker        "linker_sleb128_test.cpp",
487*8d67ca89SAndroid Build Coastguard Worker        "linker_utils_test.cpp",
488*8d67ca89SAndroid Build Coastguard Worker        "linker_gnu_hash_test.cpp",
489*8d67ca89SAndroid Build Coastguard Worker        "linker_crt_pad_segment_test.cpp",
490*8d67ca89SAndroid Build Coastguard Worker
491*8d67ca89SAndroid Build Coastguard Worker        // Parts of the linker that we're testing.
492*8d67ca89SAndroid Build Coastguard Worker        ":elf_note_sources",
493*8d67ca89SAndroid Build Coastguard Worker        "linker_block_allocator.cpp",
494*8d67ca89SAndroid Build Coastguard Worker        "linker_config.cpp",
495*8d67ca89SAndroid Build Coastguard Worker        "linker_debug.cpp",
496*8d67ca89SAndroid Build Coastguard Worker        "linker_note_gnu_property.cpp",
497*8d67ca89SAndroid Build Coastguard Worker        "linker_test_globals.cpp",
498*8d67ca89SAndroid Build Coastguard Worker        "linker_utils.cpp",
499*8d67ca89SAndroid Build Coastguard Worker        "linker_phdr.cpp",
500*8d67ca89SAndroid Build Coastguard Worker        "linker_mapped_file_fragment.cpp",
501*8d67ca89SAndroid Build Coastguard Worker        "linker_sdk_versions.cpp",
502*8d67ca89SAndroid Build Coastguard Worker        "linker_dlwarning.cpp",
503*8d67ca89SAndroid Build Coastguard Worker        "linker_phdr_16kib_compat.cpp"
504*8d67ca89SAndroid Build Coastguard Worker    ],
505*8d67ca89SAndroid Build Coastguard Worker
506*8d67ca89SAndroid Build Coastguard Worker    static_libs: [
507*8d67ca89SAndroid Build Coastguard Worker        "libasync_safe",
508*8d67ca89SAndroid Build Coastguard Worker        "libbase",
509*8d67ca89SAndroid Build Coastguard Worker        "liblog_for_runtime_apex",
510*8d67ca89SAndroid Build Coastguard Worker        "libprocinfo", // For procinfo::MappedFileSize()
511*8d67ca89SAndroid Build Coastguard Worker    ],
512*8d67ca89SAndroid Build Coastguard Worker
513*8d67ca89SAndroid Build Coastguard Worker    data_libs: [
514*8d67ca89SAndroid Build Coastguard Worker        "crt_pad_segment_disabled",
515*8d67ca89SAndroid Build Coastguard Worker        "crt_pad_segment_enabled",
516*8d67ca89SAndroid Build Coastguard Worker        "no_crt_pad_segment",
517*8d67ca89SAndroid Build Coastguard Worker    ],
518*8d67ca89SAndroid Build Coastguard Worker
519*8d67ca89SAndroid Build Coastguard Worker    arch: {
520*8d67ca89SAndroid Build Coastguard Worker        arm: {
521*8d67ca89SAndroid Build Coastguard Worker            srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
522*8d67ca89SAndroid Build Coastguard Worker        },
523*8d67ca89SAndroid Build Coastguard Worker        arm64: {
524*8d67ca89SAndroid Build Coastguard Worker            srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
525*8d67ca89SAndroid Build Coastguard Worker        },
526*8d67ca89SAndroid Build Coastguard Worker    },
527*8d67ca89SAndroid Build Coastguard Worker}
528*8d67ca89SAndroid Build Coastguard Worker
529*8d67ca89SAndroid Build Coastguard Workercc_benchmark {
530*8d67ca89SAndroid Build Coastguard Worker    name: "linker-benchmarks",
531*8d67ca89SAndroid Build Coastguard Worker
532*8d67ca89SAndroid Build Coastguard Worker    srcs: [
533*8d67ca89SAndroid Build Coastguard Worker        "linker_gnu_hash_benchmark.cpp",
534*8d67ca89SAndroid Build Coastguard Worker    ],
535*8d67ca89SAndroid Build Coastguard Worker
536*8d67ca89SAndroid Build Coastguard Worker    arch: {
537*8d67ca89SAndroid Build Coastguard Worker        arm: {
538*8d67ca89SAndroid Build Coastguard Worker            srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
539*8d67ca89SAndroid Build Coastguard Worker        },
540*8d67ca89SAndroid Build Coastguard Worker        arm64: {
541*8d67ca89SAndroid Build Coastguard Worker            srcs: ["arch/arm_neon/linker_gnu_hash_neon.cpp"],
542*8d67ca89SAndroid Build Coastguard Worker        },
543*8d67ca89SAndroid Build Coastguard Worker    },
544*8d67ca89SAndroid Build Coastguard Worker}
545