diff options
author | Nick Desaulniers (paternity leave) <nickdesaulniers@users.noreply.github.com> | 2024-06-24 14:37:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-24 14:37:50 -0700 |
commit | bea7f3d8739a12c599525c18c151f37b1293a080 (patch) | |
tree | f7780f182bf18fec53f393a0d5a0f510bf5448cd /libc | |
parent | d2864d1716b5e5b5eabb3004b04a1d7f67803f0d (diff) | |
download | llvm-bea7f3d8739a12c599525c18c151f37b1293a080.zip llvm-bea7f3d8739a12c599525c18c151f37b1293a080.tar.gz llvm-bea7f3d8739a12c599525c18c151f37b1293a080.tar.bz2 |
[libc][startup] create header for ElfW and use in startup (#96510)
This is necessary for 32b platforms such as ARM and i386.
Link: #94128
Diffstat (limited to 'libc')
-rw-r--r-- | libc/include/llvm-libc-macros/CMakeLists.txt | 6 | ||||
-rw-r--r-- | libc/include/llvm-libc-macros/link-macros.h | 13 | ||||
-rw-r--r-- | libc/startup/linux/CMakeLists.txt | 1 | ||||
-rw-r--r-- | libc/startup/linux/do_start.cpp | 9 |
4 files changed, 25 insertions, 4 deletions
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index a4c2ca0..f6af11a 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -104,6 +104,12 @@ add_macro_header( ) add_macro_header( + link_macros + HDR + link-macros.h +) + +add_macro_header( math_macros HDR math-macros.h diff --git a/libc/include/llvm-libc-macros/link-macros.h b/libc/include/llvm-libc-macros/link-macros.h new file mode 100644 index 0000000..5c8cada --- /dev/null +++ b/libc/include/llvm-libc-macros/link-macros.h @@ -0,0 +1,13 @@ +//===-- Definition of macros to for extra dynamic linker functionality ----===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifdef __LP64__ +#define ElfW(type) Elf64_ ## type +#else +#define ElfW(type) Elf32_ ## type +#endif diff --git a/libc/startup/linux/CMakeLists.txt b/libc/startup/linux/CMakeLists.txt index f041a48..336c5d0 100644 --- a/libc/startup/linux/CMakeLists.txt +++ b/libc/startup/linux/CMakeLists.txt @@ -98,6 +98,7 @@ add_object_library( libc.config.linux.app_h libc.include.sys_mman libc.include.sys_syscall + libc.include.llvm-libc-macros.link_macros libc.src.__support.threads.thread libc.src.__support.OSUtil.osutil libc.src.stdlib.exit diff --git a/libc/startup/linux/do_start.cpp b/libc/startup/linux/do_start.cpp index 55fd575..3d7d32a 100644 --- a/libc/startup/linux/do_start.cpp +++ b/libc/startup/linux/do_start.cpp @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// #include "startup/linux/do_start.h" +#include "include/llvm-libc-macros/link-macros.h" #include "src/__support/OSUtil/syscall.h" #include "src/__support/threads/thread.h" #include "src/stdlib/atexit.h" @@ -79,13 +80,13 @@ static ThreadAttributes main_thread_attrib; // After the env array, is the aux-vector. The end of the aux-vector is // denoted by an AT_NULL entry. - Elf64_Phdr *program_hdr_table = nullptr; + ElfW(Phdr) *program_hdr_table = nullptr; uintptr_t program_hdr_count = 0; app.auxv_ptr = reinterpret_cast<AuxEntry *>(env_end_marker + 1); for (auto *aux_entry = app.auxv_ptr; aux_entry->id != AT_NULL; ++aux_entry) { switch (aux_entry->id) { case AT_PHDR: - program_hdr_table = reinterpret_cast<Elf64_Phdr *>(aux_entry->value); + program_hdr_table = reinterpret_cast<ElfW(Phdr) *>(aux_entry->value); break; case AT_PHNUM: program_hdr_count = aux_entry->value; @@ -100,10 +101,10 @@ static ThreadAttributes main_thread_attrib; ptrdiff_t base = 0; app.tls.size = 0; - Elf64_Phdr *tls_phdr = nullptr; + ElfW(Phdr) *tls_phdr = nullptr; for (uintptr_t i = 0; i < program_hdr_count; ++i) { - Elf64_Phdr &phdr = program_hdr_table[i]; + ElfW(Phdr) &phdr = program_hdr_table[i]; if (phdr.p_type == PT_PHDR) base = reinterpret_cast<ptrdiff_t>(program_hdr_table) - phdr.p_vaddr; if (phdr.p_type == PT_DYNAMIC && _DYNAMIC) |