aboutsummaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorNick Desaulniers (paternity leave) <nickdesaulniers@users.noreply.github.com>2024-06-24 14:37:50 -0700
committerGitHub <noreply@github.com>2024-06-24 14:37:50 -0700
commitbea7f3d8739a12c599525c18c151f37b1293a080 (patch)
treef7780f182bf18fec53f393a0d5a0f510bf5448cd /libc
parentd2864d1716b5e5b5eabb3004b04a1d7f67803f0d (diff)
downloadllvm-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.txt6
-rw-r--r--libc/include/llvm-libc-macros/link-macros.h13
-rw-r--r--libc/startup/linux/CMakeLists.txt1
-rw-r--r--libc/startup/linux/do_start.cpp9
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)