[libc-commits] [libc] [libc] Add `link.h` and `elf.h` headers (PR #97924)
Izaak Schroeder via libc-commits
libc-commits at lists.llvm.org
Sat Jul 6 17:38:06 PDT 2024
https://github.com/izaakschroeder updated https://github.com/llvm/llvm-project/pull/97924
>From f8867ba93836f58034f6ecc8aa1409323df683c0 Mon Sep 17 00:00:00 2001
From: Izaak Schroeder <izaak.schroeder at gmail.com>
Date: Sat, 6 Jul 2024 16:49:01 -0700
Subject: [PATCH 1/3] [libc] Add `link.h` and `elf.h` headers
---
libc/config/linux/aarch64/headers.txt | 2 ++
libc/config/linux/x86_64/headers.txt | 2 ++
libc/include/CMakeLists.txt | 20 ++++++++++++++
libc/include/llvm-libc-macros/CMakeLists.txt | 6 +++++
libc/include/llvm-libc-macros/elf-macros.h | 18 +++++++++++++
libc/include/llvm-libc-macros/link-macros.h | 26 +++++++++++++++++--
libc/include/llvm-libc-types/CMakeLists.txt | 3 +++
libc/include/llvm-libc-types/Dl_info.h | 19 ++++++++++++++
.../__dl_iterate_phdr_callback_t.h | 17 ++++++++++++
.../llvm-libc-types/struct_dl_phdr_info.h | 26 +++++++++++++++++++
10 files changed, 137 insertions(+), 2 deletions(-)
create mode 100644 libc/include/llvm-libc-macros/elf-macros.h
create mode 100644 libc/include/llvm-libc-types/Dl_info.h
create mode 100644 libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h
create mode 100644 libc/include/llvm-libc-types/struct_dl_phdr_info.h
diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt
index 8f898f0150905..ebe053af99d80 100644
--- a/libc/config/linux/aarch64/headers.txt
+++ b/libc/config/linux/aarch64/headers.txt
@@ -2,6 +2,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.assert
libc.include.ctype
libc.include.dlfcn
+ libc.include.elf
libc.include.errno
libc.include.features
libc.include.fenv
@@ -9,6 +10,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.stdint
libc.include.inttypes
libc.include.limits
+ libc.include.link
libc.include.math
libc.include.pthread
libc.include.signal
diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt
index df276894246c4..903771c5f96a6 100644
--- a/libc/config/linux/x86_64/headers.txt
+++ b/libc/config/linux/x86_64/headers.txt
@@ -3,6 +3,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.ctype
libc.include.dirent
libc.include.dlfcn
+ libc.include.elf
libc.include.errno
libc.include.fcntl
libc.include.features
@@ -11,6 +12,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.stdint
libc.include.inttypes
libc.include.limits
+ libc.include.link
libc.include.math
libc.include.pthread
libc.include.sched
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index f8ef35078a8c4..a39c1c118165f 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -56,6 +56,7 @@ add_gen_header(
DEF_FILE dlfcn.h.def
GEN_HDR dlfcn.h
DEPENDS
+ .llvm-libc-types.Dl_info
.llvm-libc-macros.dlfcn_macros
.llvm_libc_common_h
)
@@ -367,6 +368,25 @@ add_gen_header(
.llvm-libc-types.posix_spawn_file_actions_t
)
+add_gen_header(
+ link
+ DEF_FILE link.h.def
+ GEN_HDR link.h
+ DEPENDS
+ .llvm_libc_common_h
+ .llvm-libc-types.struct_dl_phdr_info
+ .llvm-libc-types.__dl_iterate_phdr_callback_t
+ .llvm-libc-macros.link_macros
+)
+
+add_gen_header(
+ elf
+ DEF_FILE elf.h.def
+ GEN_HDR elf.h
+ DEPENDS
+ .llvm-libc-macros.elf_macros
+)
+
# TODO: Not all platforms will have a include/sys directory. Add the sys
# directory and the targets for sys/*.h files conditional to the OS requiring
# them.
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt
index 86d6271ff88ac..60c8f5a9cd3de 100644
--- a/libc/include/llvm-libc-macros/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/CMakeLists.txt
@@ -283,3 +283,9 @@ add_macro_header(
HDR
dlfcn-macros.h
)
+
+add_macro_header(
+ elf_macros
+ HDR
+ elf-macros.h
+)
diff --git a/libc/include/llvm-libc-macros/elf-macros.h b/libc/include/llvm-libc-macros/elf-macros.h
new file mode 100644
index 0000000000000..fa4442abf0f5c
--- /dev/null
+++ b/libc/include/llvm-libc-macros/elf-macros.h
@@ -0,0 +1,18 @@
+//===-- Definition of macros from elf.h -----------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_MACROS_ELF_MACROS_H
+#define LLVM_LIBC_MACROS_ELF_MACROS_H
+
+#if __has_include(<linux/elf.h>)
+#include <linux/elf.h>
+#else
+#error "cannot use <sys/elf.h> without proper system headers."
+#endif
+
+#endif // LLVM_LIBC_MACROS_ELF_MACROS_H
diff --git a/libc/include/llvm-libc-macros/link-macros.h b/libc/include/llvm-libc-macros/link-macros.h
index 5c8cadab8e71c..f7461d9527a47 100644
--- a/libc/include/llvm-libc-macros/link-macros.h
+++ b/libc/include/llvm-libc-macros/link-macros.h
@@ -6,8 +6,30 @@
//
//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_MACROS_LINK_MACROS_H
+#define LLVM_LIBC_MACROS_LINK_MACROS_H
+
+#include "elf-macros.h"
+
#ifdef __LP64__
-#define ElfW(type) Elf64_ ## type
+#define ElfW(type) Elf64_##type
#else
-#define ElfW(type) Elf32_ ## type
+#define ElfW(type) Elf32_##type
+#endif
+
+struct link_map {
+ ElfW(Addr) l_addr;
+ char *l_name;
+ ElfW(Dyn) * l_ld;
+ struct link_map *l_next, *l_prev;
+};
+
+struct r_debug {
+ int r_version;
+ struct link_map *r_map;
+ ElfW(Addr) r_brk;
+ enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state;
+ ElfW(Addr) r_ldbase;
+};
+
#endif
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index d8b975572e0dd..016ec14b077e8 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -89,6 +89,9 @@ add_header(thrd_t HDR thrd_t.h DEPENDS .__thread_type)
add_header(tss_t HDR tss_t.h)
add_header(tss_dtor_t HDR tss_dtor_t.h)
add_header(__atexithandler_t HDR __atexithandler_t.h)
+add_header(Dl_info HDR Dl_info.h)
+add_header(struct_dl_phdr_info HDR struct_dl_phdr_info.h)
+add_header(__dl_iterate_phdr_callback_t HDR __dl_iterate_phdr_callback_t.h)
add_header(speed_t HDR speed_t.h)
add_header(tcflag_t HDR tcflag_t.h)
add_header(struct_termios HDR struct_termios.h DEPENDS .cc_t .speed_t .tcflag_t)
diff --git a/libc/include/llvm-libc-types/Dl_info.h b/libc/include/llvm-libc-types/Dl_info.h
new file mode 100644
index 0000000000000..613976a54bd61
--- /dev/null
+++ b/libc/include/llvm-libc-types/Dl_info.h
@@ -0,0 +1,19 @@
+//===-- Definition of type Dl_info ----------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_DL_INFO_H
+#define LLVM_LIBC_TYPES_DL_INFO_H
+
+typedef struct {
+ const char *dli_fname;
+ void *dli_fbase;
+ const char *dli_sname;
+ void *dli_saddr;
+} Dl_info;
+
+#endif // LLVM_LIBC_TYPES_DL_INFO_H
diff --git a/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h b/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h
new file mode 100644
index 0000000000000..9d73e88076e00
--- /dev/null
+++ b/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h
@@ -0,0 +1,17 @@
+//===-- Definition of __dl_iterate_phdr_callback_t type -------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H
+#define LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H
+
+#include "llvm-libc-types/size_t.h"
+
+typedef int (*__dl_iterate_phdr_callback_t)(struct dl_phdr_info *info,
+ size_t size, void *data);
+
+#endif // LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H
diff --git a/libc/include/llvm-libc-types/struct_dl_phdr_info.h b/libc/include/llvm-libc-types/struct_dl_phdr_info.h
new file mode 100644
index 0000000000000..66512b368e190
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_dl_phdr_info.h
@@ -0,0 +1,26 @@
+//===-- Definition of type struct dl_phdr_info ----------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H
+#define LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H
+
+#include "llvm-libc-macros/link-macros.h"
+#include "llvm-libc-types/size_t.h"
+
+struct dl_phdr_info {
+ ElfW(Addr) dlpi_addr;
+ const char *dlpi_name;
+ const ElfW(Phdr) * dlpi_phdr;
+ ElfW(Half) dlpi_phnum;
+ unsigned long long int dlpi_adds;
+ unsigned long long int dlpi_subs;
+ size_t dlpi_tls_modid;
+ void *dlpi_tls_data;
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H
>From fa3703b610f65457ebde09739cb32590691860e5 Mon Sep 17 00:00:00 2001
From: Izaak Schroeder <izaak.schroeder at gmail.com>
Date: Sat, 6 Jul 2024 17:22:01 -0700
Subject: [PATCH 2/3] fixup! Add header dependencies
---
libc/include/llvm-libc-types/CMakeLists.txt | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index 016ec14b077e8..9986329570c88 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -90,8 +90,21 @@ add_header(tss_t HDR tss_t.h)
add_header(tss_dtor_t HDR tss_dtor_t.h)
add_header(__atexithandler_t HDR __atexithandler_t.h)
add_header(Dl_info HDR Dl_info.h)
-add_header(struct_dl_phdr_info HDR struct_dl_phdr_info.h)
-add_header(__dl_iterate_phdr_callback_t HDR __dl_iterate_phdr_callback_t.h)
+add_header(
+ __dl_iterate_phdr_callback_t
+ HDR __dl_iterate_phdr_callback_t.h
+ DEPENDS
+ .size_t
+)
+add_header(
+ struct_dl_phdr_info
+ HDR struct_dl_phdr_info.h
+ DEPENDS
+ .__dl_iterate_phdr_callback_t
+ .size_t
+ libc.include.llvm-libc-macros.link-macros
+)
+
add_header(speed_t HDR speed_t.h)
add_header(tcflag_t HDR tcflag_t.h)
add_header(struct_termios HDR struct_termios.h DEPENDS .cc_t .speed_t .tcflag_t)
>From 4dc7c880e3ac7c7f07b6350051552e8defe0ba0d Mon Sep 17 00:00:00 2001
From: Izaak Schroeder <izaak.schroeder at gmail.com>
Date: Sat, 6 Jul 2024 17:37:40 -0700
Subject: [PATCH 3/3] fixup! `link_macros` is underscore
---
libc/include/llvm-libc-types/CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index 9986329570c88..87381136577ef 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -102,7 +102,7 @@ add_header(
DEPENDS
.__dl_iterate_phdr_callback_t
.size_t
- libc.include.llvm-libc-macros.link-macros
+ libc.include.llvm-libc-macros.link_macros
)
add_header(speed_t HDR speed_t.h)
More information about the libc-commits
mailing list