[libc-commits] [libc] [libc] Add `link.h` and `elf.h` (PR #97504)
Izaak Schroeder via libc-commits
libc-commits at lists.llvm.org
Wed Jul 3 20:32:59 PDT 2024
https://github.com/izaakschroeder updated https://github.com/llvm/llvm-project/pull/97504
>From eb521738bd7ce3ff9df1838a704e4a3e984255bb Mon Sep 17 00:00:00 2001
From: Izaak Schroeder <izaak.schroeder at gmail.com>
Date: Mon, 1 Jul 2024 16:23:01 -0700
Subject: [PATCH 1/2] [libc] Add `dlfcn.h` placeholder
---
libc/config/linux/aarch64/entrypoints.txt | 6 +++
libc/config/linux/aarch64/headers.txt | 1 +
libc/config/linux/x86_64/entrypoints.txt | 6 +++
libc/config/linux/x86_64/headers.txt | 1 +
libc/include/CMakeLists.txt | 9 ++++
libc/include/dlfcn.h.def | 17 ++++++++
libc/include/llvm-libc-macros/CMakeLists.txt | 6 +++
libc/include/llvm-libc-macros/dlfcn-macros.h | 23 +++++++++++
libc/spec/posix.td | 35 ++++++++++++++++
libc/src/CMakeLists.txt | 1 +
libc/src/dlfcn/CMakeLists.txt | 43 ++++++++++++++++++++
libc/src/dlfcn/dlclose.cpp | 17 ++++++++
libc/src/dlfcn/dlclose.h | 18 ++++++++
libc/src/dlfcn/dlerror.cpp | 19 +++++++++
libc/src/dlfcn/dlerror.h | 18 ++++++++
libc/src/dlfcn/dlopen.cpp | 17 ++++++++
libc/src/dlfcn/dlopen.h | 18 ++++++++
libc/src/dlfcn/dlsym.cpp | 17 ++++++++
libc/src/dlfcn/dlsym.h | 18 ++++++++
19 files changed, 290 insertions(+)
create mode 100644 libc/include/dlfcn.h.def
create mode 100644 libc/include/llvm-libc-macros/dlfcn-macros.h
create mode 100644 libc/src/dlfcn/CMakeLists.txt
create mode 100644 libc/src/dlfcn/dlclose.cpp
create mode 100644 libc/src/dlfcn/dlclose.h
create mode 100644 libc/src/dlfcn/dlerror.cpp
create mode 100644 libc/src/dlfcn/dlerror.h
create mode 100644 libc/src/dlfcn/dlopen.cpp
create mode 100644 libc/src/dlfcn/dlopen.h
create mode 100644 libc/src/dlfcn/dlsym.cpp
create mode 100644 libc/src/dlfcn/dlsym.h
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 940df63e3912b7..70c588622ec6b2 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -17,6 +17,12 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.ctype.tolower
libc.src.ctype.toupper
+ # dlfcn.h entrypoints
+ libc.src.dlfcn.dlopen
+ libc.src.dlfcn.dlsym
+ libc.src.dlfcn.dlclose
+ libc.src.dlfcn.dlerror
+
# errno.h entrypoints
libc.src.errno.errno
diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt
index 7d25877cefcc83..8f898f0150905a 100644
--- a/libc/config/linux/aarch64/headers.txt
+++ b/libc/config/linux/aarch64/headers.txt
@@ -1,6 +1,7 @@
set(TARGET_PUBLIC_HEADERS
libc.include.assert
libc.include.ctype
+ libc.include.dlfcn
libc.include.errno
libc.include.features
libc.include.fenv
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 09f04fb31dfd82..ba60475809853f 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -17,6 +17,12 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.ctype.tolower
libc.src.ctype.toupper
+ # dlfcn.h entrypoints
+ libc.src.dlfcn.dlopen
+ libc.src.dlfcn.dlsym
+ libc.src.dlfcn.dlclose
+ libc.src.dlfcn.dlerror
+
# errno.h entrypoints
libc.src.errno.errno
diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt
index 44d640b75e2bf7..df276894246c4c 100644
--- a/libc/config/linux/x86_64/headers.txt
+++ b/libc/config/linux/x86_64/headers.txt
@@ -2,6 +2,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.assert
libc.include.ctype
libc.include.dirent
+ libc.include.dlfcn
libc.include.errno
libc.include.fcntl
libc.include.features
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index 3ab7817d8568b7..f8ef35078a8c46 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -51,6 +51,15 @@ add_gen_header(
.llvm_libc_common_h
)
+add_gen_header(
+ dlfcn
+ DEF_FILE dlfcn.h.def
+ GEN_HDR dlfcn.h
+ DEPENDS
+ .llvm-libc-macros.dlfcn_macros
+ .llvm_libc_common_h
+)
+
add_gen_header(
features
DEF_FILE features.h.def
diff --git a/libc/include/dlfcn.h.def b/libc/include/dlfcn.h.def
new file mode 100644
index 00000000000000..31395871c6b97e
--- /dev/null
+++ b/libc/include/dlfcn.h.def
@@ -0,0 +1,17 @@
+//===-- C standard library header dlfcn.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_DLFCN_H
+#define LLVM_LIBC_DLFCN_H
+
+#include "__llvm-libc-common.h"
+#include "llvm-libc-macros/dlfcn-macros.h"
+
+%%public_api()
+
+#endif // LLVM_LIBC_DLFCN_H
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt
index f6af11abd4dd76..5bf573e4e98dfe 100644
--- a/libc/include/llvm-libc-macros/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/CMakeLists.txt
@@ -277,3 +277,9 @@ add_macro_header(
HDR
stdckdint-macros.h
)
+
+add_macro_header(
+ dlfcn_macros
+ HDR
+ dlfcn-macros.h
+)
\ No newline at end of file
diff --git a/libc/include/llvm-libc-macros/dlfcn-macros.h b/libc/include/llvm-libc-macros/dlfcn-macros.h
new file mode 100644
index 00000000000000..dcd202b9ab435c
--- /dev/null
+++ b/libc/include/llvm-libc-macros/dlfcn-macros.h
@@ -0,0 +1,23 @@
+//===-- Definition of macros from dlfcn.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_DLFCN_MACROS_H
+#define LLVM_LIBC_MACROS_DLFCN_MACROS_H
+
+#define RTLD_LAZY 0x00001
+#define RTLD_NOW 0x00002
+#define RTLD_GLOBAL 0x00100
+#define RTLD_LOCAL 0
+
+// Non-standard stuff here
+#define RTLD_BINDING_MASK 0x3
+#define RTLD_NOLOAD 0x00004
+#define RTLD_DEEPBIND 0x00008
+#define RTLD_NODELETE 0x01000
+
+#endif // LLVM_LIBC_MACROS_DLFCN_MACROS_H
diff --git a/libc/spec/posix.td b/libc/spec/posix.td
index d14047548e104f..1878b1ee2ae412 100644
--- a/libc/spec/posix.td
+++ b/libc/spec/posix.td
@@ -222,6 +222,40 @@ def POSIX : StandardSpec<"POSIX"> {
[] // Functions
>;
+ HeaderSpec DlFcn = HeaderSpec<
+ "dlfcn.h",
+ [
+ Macro<"RTLD_LAZY">,
+ Macro<"RTLD_NOW">,
+ Macro<"RTLD_GLOBAL">,
+ Macro<"RTLD_LOCAL">,
+ ],
+ [], // Types
+ [], // Enumerations
+ [
+ FunctionSpec<
+ "dlclose",
+ RetValSpec<IntType>,
+ [ArgSpec<VoidPtr>]
+ >,
+ FunctionSpec<
+ "dlerror",
+ RetValSpec<CharPtr>,
+ []
+ >,
+ FunctionSpec<
+ "dlopen",
+ RetValSpec<VoidPtr>,
+ [ArgSpec<ConstCharPtr>, ArgSpec<IntType>]
+ >,
+ FunctionSpec<
+ "dlsym",
+ RetValSpec<VoidPtr>,
+ [ArgSpec<VoidRestrictedPtr>, ArgSpec<ConstCharRestrictedPtr>]
+ >,
+ ]
+ >;
+
HeaderSpec FCntl = HeaderSpec<
"fcntl.h",
[], // Macros
@@ -1690,6 +1724,7 @@ def POSIX : StandardSpec<"POSIX"> {
ArpaInet,
CType,
Dirent,
+ DlFcn,
Errno,
FCntl,
PThread,
diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt
index 09b16be1e2d42e..f011fe25226e55 100644
--- a/libc/src/CMakeLists.txt
+++ b/libc/src/CMakeLists.txt
@@ -11,6 +11,7 @@ add_subdirectory(stdio)
add_subdirectory(stdlib)
add_subdirectory(string)
add_subdirectory(wchar)
+add_subdirectory(dlfcn)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(dirent)
diff --git a/libc/src/dlfcn/CMakeLists.txt b/libc/src/dlfcn/CMakeLists.txt
new file mode 100644
index 00000000000000..5534f2dfb88533
--- /dev/null
+++ b/libc/src/dlfcn/CMakeLists.txt
@@ -0,0 +1,43 @@
+add_entrypoint_object(
+ dlclose
+ SRCS
+ dlclose.cpp
+ HDRS
+ dlclose.h
+ DEPENDS
+ libc.include.dlfcn
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ dlerror
+ SRCS
+ dlerror.cpp
+ HDRS
+ dlerror.h
+ DEPENDS
+ libc.include.dlfcn
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ dlopen
+ SRCS
+ dlopen.cpp
+ HDRS
+ dlopen.h
+ DEPENDS
+ libc.include.dlfcn
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ dlsym
+ SRCS
+ dlsym.cpp
+ HDRS
+ dlsym.h
+ DEPENDS
+ libc.include.dlfcn
+ libc.src.errno.errno
+)
diff --git a/libc/src/dlfcn/dlclose.cpp b/libc/src/dlfcn/dlclose.cpp
new file mode 100644
index 00000000000000..6dc1892120dddb
--- /dev/null
+++ b/libc/src/dlfcn/dlclose.cpp
@@ -0,0 +1,17 @@
+//===-- Implementation of dlclose -----------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "dlclose.h"
+
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, dlclose, (void *)) { return -1; }
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/dlfcn/dlclose.h b/libc/src/dlfcn/dlclose.h
new file mode 100644
index 00000000000000..27c0207d726e49
--- /dev/null
+++ b/libc/src/dlfcn/dlclose.h
@@ -0,0 +1,18 @@
+//===-- Implementation header of dlclose ------------------------*- C++ -*-===//
+//
+// 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_SRC_DLFCN_DLCLOSE_H
+#define LLVM_LIBC_SRC_DLFCN_DLCLOSE_H
+
+namespace LIBC_NAMESPACE {
+
+int dlclose(void *);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_DLFCN_DLCLOSE_H
diff --git a/libc/src/dlfcn/dlerror.cpp b/libc/src/dlfcn/dlerror.cpp
new file mode 100644
index 00000000000000..8c3611d9c639e5
--- /dev/null
+++ b/libc/src/dlfcn/dlerror.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of delerror ----------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "dlerror.h"
+
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(char *, dlerror, ()) {
+ return const_cast<char *>("unsupported");
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/dlfcn/dlerror.h b/libc/src/dlfcn/dlerror.h
new file mode 100644
index 00000000000000..966496016d3ebd
--- /dev/null
+++ b/libc/src/dlfcn/dlerror.h
@@ -0,0 +1,18 @@
+//===-- Implementation header of dlerror ------------------------*- C++ -*-===//
+//
+// 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_SRC_DLFCN_DLERROR_H
+#define LLVM_LIBC_SRC_DLFCN_DLERROR_H
+
+namespace LIBC_NAMESPACE {
+
+char *dlerror();
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_DLFCN_DLERROR_H
diff --git a/libc/src/dlfcn/dlopen.cpp b/libc/src/dlfcn/dlopen.cpp
new file mode 100644
index 00000000000000..835d981e192371
--- /dev/null
+++ b/libc/src/dlfcn/dlopen.cpp
@@ -0,0 +1,17 @@
+//===-- Implementation of dlopen -----------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "dlopen.h"
+
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(void *, dlopen, (const char *, int)) { return nullptr; }
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/dlfcn/dlopen.h b/libc/src/dlfcn/dlopen.h
new file mode 100644
index 00000000000000..4565953efd4943
--- /dev/null
+++ b/libc/src/dlfcn/dlopen.h
@@ -0,0 +1,18 @@
+//===-- Implementation header of dlopen -------------------------*- C++ -*-===//
+//
+// 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_SRC_DLFCN_DLOPEN_H
+#define LLVM_LIBC_SRC_DLFCN_DLOPEN_H
+
+namespace LIBC_NAMESPACE {
+
+void *dlopen(const char *, int);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_DLFCN_DLOPEN_H
diff --git a/libc/src/dlfcn/dlsym.cpp b/libc/src/dlfcn/dlsym.cpp
new file mode 100644
index 00000000000000..98d678caece902
--- /dev/null
+++ b/libc/src/dlfcn/dlsym.cpp
@@ -0,0 +1,17 @@
+//===-- Implementation of dlsym ------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "dlsym.h"
+
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(void *, dlsym, (void *, const char *)) { return nullptr; }
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/dlfcn/dlsym.h b/libc/src/dlfcn/dlsym.h
new file mode 100644
index 00000000000000..8157ac3e3fd4ca
--- /dev/null
+++ b/libc/src/dlfcn/dlsym.h
@@ -0,0 +1,18 @@
+//===-- Implementation header of dlsym --------------------------*- C++ -*-===//
+//
+// 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_SRC_DLFCN_DLSYM_H
+#define LLVM_LIBC_SRC_DLFCN_DLSYM_H
+
+namespace LIBC_NAMESPACE {
+
+void *dlsym(void *, const char *);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_DLFCN_DLSYM_H
>From d7610bc1e28b29f6646d63720afac376fe231200 Mon Sep 17 00:00:00 2001
From: Izaak Schroeder <izaak.schroeder at gmail.com>
Date: Mon, 1 Jul 2024 19:40:07 -0700
Subject: [PATCH 2/2] [libc] Add `link.h` and `elf.h`
---
libc/config/linux/aarch64/entrypoints.txt | 5 ++++
libc/config/linux/aarch64/headers.txt | 2 ++
libc/config/linux/api.td | 13 ++++++++
libc/config/linux/x86_64/entrypoints.txt | 5 ++++
libc/config/linux/x86_64/headers.txt | 2 ++
libc/include/CMakeLists.txt | 20 +++++++++++++
libc/include/elf.h.def | 14 +++++++++
libc/include/link.h.def | 16 ++++++++++
libc/include/llvm-libc-macros/CMakeLists.txt | 8 ++++-
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 ++++++++++++++++
libc/spec/linux.td | 30 +++++++++++++++++++
libc/spec/posix.td | 10 ++++++-
libc/src/CMakeLists.txt | 1 +
libc/src/dlfcn/CMakeLists.txt | 11 +++++++
libc/src/dlfcn/dladdr.cpp | 17 +++++++++++
libc/src/dlfcn/dladdr.h | 20 +++++++++++++
libc/src/link/CMakeLists.txt | 9 ++++++
libc/src/link/dl_iterate_phdr.cpp | 20 +++++++++++++
libc/src/link/dl_iterate_phdr.h | 20 +++++++++++++
24 files changed, 328 insertions(+), 4 deletions(-)
create mode 100644 libc/include/elf.h.def
create mode 100644 libc/include/link.h.def
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
create mode 100644 libc/src/dlfcn/dladdr.cpp
create mode 100644 libc/src/dlfcn/dladdr.h
create mode 100644 libc/src/link/CMakeLists.txt
create mode 100644 libc/src/link/dl_iterate_phdr.cpp
create mode 100644 libc/src/link/dl_iterate_phdr.h
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 70c588622ec6b2..fe4cec1d7a77ff 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -22,6 +22,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.dlfcn.dlsym
libc.src.dlfcn.dlclose
libc.src.dlfcn.dlerror
+ libc.src.dlfcn.dlsym
+ libc.src.dlfcn.dladdr
# errno.h entrypoints
libc.src.errno.errno
@@ -32,6 +34,9 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.fcntl.open
libc.src.fcntl.openat
+ # link.h entrypoints
+ libc.src.link.dl_iterate_phdr
+
# sched.h entrypoints
libc.src.sched.sched_get_priority_max
libc.src.sched.sched_get_priority_min
diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt
index 8f898f0150905a..ebe053af99d803 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/api.td b/libc/config/linux/api.td
index eb0090c80b0da3..3ff99f263f8118 100644
--- a/libc/config/linux/api.td
+++ b/libc/config/linux/api.td
@@ -308,3 +308,16 @@ def SearchAPI : PublicAPI<"search.h"> {
def SysStatvfsAPI : PublicAPI<"sys/statvfs.h"> {
let Types = ["fsblkcnt_t", "fsfilcnt_t", "struct statvfs"];
}
+
+def LinkAPI : PublicAPI<"link.h"> {
+ let Types = [
+ "struct dl_phdr_info",
+ "__dl_iterate_phdr_callback_t"
+ ];
+}
+
+def DlfcnAPI : PublicAPI<"dlfcn.h"> {
+ let Types = [
+ "Dl_info"
+ ];
+}
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index ba60475809853f..18e682e52bb12f 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -22,6 +22,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.dlfcn.dlsym
libc.src.dlfcn.dlclose
libc.src.dlfcn.dlerror
+ libc.src.dlfcn.dlsym
+ libc.src.dlfcn.dladdr
# errno.h entrypoints
libc.src.errno.errno
@@ -32,6 +34,9 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.fcntl.open
libc.src.fcntl.openat
+ # link.h entrypoints
+ libc.src.link.dl_iterate_phdr
+
# sched.h entrypoints
libc.src.sched.sched_get_priority_max
libc.src.sched.sched_get_priority_min
diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt
index df276894246c4c..903771c5f96a6a 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 f8ef35078a8c46..a39c1c118165fa 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/elf.h.def b/libc/include/elf.h.def
new file mode 100644
index 00000000000000..1c9d11929029f4
--- /dev/null
+++ b/libc/include/elf.h.def
@@ -0,0 +1,14 @@
+//===-- C standard library header 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_ELF_H
+#define LLVM_LIBC_ELF_H
+
+#include "llvm-libc-macros/elf-macros.h"
+
+#endif // LLVM_LIBC_ELF_H
diff --git a/libc/include/link.h.def b/libc/include/link.h.def
new file mode 100644
index 00000000000000..353398e4f3c887
--- /dev/null
+++ b/libc/include/link.h.def
@@ -0,0 +1,16 @@
+//===-- C standard library header link.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_LINK_H
+#define LLVM_LIBC_LINK_H
+
+#include "llvm-libc-macros/link-macros.h"
+
+%%public_api()
+
+#endif // LLVM_LIBC_LINK_H
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt
index 5bf573e4e98dfe..60c8f5a9cd3de4 100644
--- a/libc/include/llvm-libc-macros/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/CMakeLists.txt
@@ -282,4 +282,10 @@ add_macro_header(
dlfcn_macros
HDR
dlfcn-macros.h
-)
\ No newline at end of file
+)
+
+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 00000000000000..fa4442abf0f5ce
--- /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 5c8cadab8e71cb..f7461d9527a47b 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 d8b975572e0dd3..016ec14b077e8d 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 00000000000000..613976a54bd612
--- /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 00000000000000..9d73e88076e00c
--- /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 00000000000000..66512b368e1904
--- /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
diff --git a/libc/spec/linux.td b/libc/spec/linux.td
index 82630ff413c73d..bd13dd17a85cdb 100644
--- a/libc/spec/linux.td
+++ b/libc/spec/linux.td
@@ -3,6 +3,9 @@ def StructEpollEventPtr : PtrType<StructEpollEvent>;
def StructEpollData : NamedType<"struct epoll_data">;
+def StructDlPhdrInfo : NamedType<"struct dl_phdr_info">;
+def DlIteratePhdrCallback : NamedType<"__dl_iterate_phdr_callback_t">;
+
def Linux : StandardSpec<"Linux"> {
HeaderSpec Errno = HeaderSpec<
"errno.h",
@@ -264,8 +267,35 @@ def Linux : StandardSpec<"Linux"> {
]
>;
+ HeaderSpec Link = HeaderSpec<
+ "link.h",
+ [], // Macros
+ [StructDlPhdrInfo, DlIteratePhdrCallback], // Types
+ [], // Enumerations
+ [
+ FunctionSpec<
+ "dl_iterate_phdr",
+ RetValSpec<IntType>,
+ [
+ ArgSpec<DlIteratePhdrCallback>,
+ ArgSpec<VoidPtr>
+ ]
+ >,
+ ] // Functions
+ >;
+
+ HeaderSpec Elf = HeaderSpec<
+ "elf.h",
+ [], // Macros
+ [], // Types
+ [], // Enumerations
+ [] // Functions
+ >;
+
let Headers = [
+ Elf,
Errno,
+ Link,
SysEpoll,
SysMMan,
SysPrctl,
diff --git a/libc/spec/posix.td b/libc/spec/posix.td
index 1878b1ee2ae412..1a829704c06672 100644
--- a/libc/spec/posix.td
+++ b/libc/spec/posix.td
@@ -21,6 +21,9 @@ def PThreadOnceT : NamedType<"pthread_once_t">;
def PThreadOnceTPtr : PtrType<PThreadOnceT>;
def PThreadOnceCallback : NamedType<"__pthread_once_func_t">;
+def DlInfo : NamedType<"Dl_info">;
+def DlInfoPtr : PtrType<DlInfo>;
+
def InoT : NamedType<"ino_t">;
def UidT : NamedType<"uid_t">;
def GidT : NamedType<"gid_t">;
@@ -230,9 +233,14 @@ def POSIX : StandardSpec<"POSIX"> {
Macro<"RTLD_GLOBAL">,
Macro<"RTLD_LOCAL">,
],
- [], // Types
+ [DlInfo], // Types
[], // Enumerations
[
+ FunctionSpec<
+ "dladdr",
+ RetValSpec<IntType>,
+ [ArgSpec<ConstVoidPtr>, ArgSpec<DlInfoPtr>]
+ >,
FunctionSpec<
"dlclose",
RetValSpec<IntType>,
diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt
index f011fe25226e55..9ff88cffc487c8 100644
--- a/libc/src/CMakeLists.txt
+++ b/libc/src/CMakeLists.txt
@@ -12,6 +12,7 @@ add_subdirectory(stdlib)
add_subdirectory(string)
add_subdirectory(wchar)
add_subdirectory(dlfcn)
+add_subdirectory(link)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(dirent)
diff --git a/libc/src/dlfcn/CMakeLists.txt b/libc/src/dlfcn/CMakeLists.txt
index 5534f2dfb88533..5321499b2e3349 100644
--- a/libc/src/dlfcn/CMakeLists.txt
+++ b/libc/src/dlfcn/CMakeLists.txt
@@ -1,3 +1,14 @@
+add_entrypoint_object(
+ dladdr
+ SRCS
+ dladdr.cpp
+ HDRS
+ dladdr.h
+ DEPENDS
+ libc.include.dlfcn
+ libc.src.errno.errno
+)
+
add_entrypoint_object(
dlclose
SRCS
diff --git a/libc/src/dlfcn/dladdr.cpp b/libc/src/dlfcn/dladdr.cpp
new file mode 100644
index 00000000000000..00ff1845fbe3e1
--- /dev/null
+++ b/libc/src/dlfcn/dladdr.cpp
@@ -0,0 +1,17 @@
+//===-- Implementation of dladdr -----------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "dladdr.h"
+
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, dladdr, (const void *, Dl_info *)) { return 0; }
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/dlfcn/dladdr.h b/libc/src/dlfcn/dladdr.h
new file mode 100644
index 00000000000000..b86f3fdea0ddef
--- /dev/null
+++ b/libc/src/dlfcn/dladdr.h
@@ -0,0 +1,20 @@
+//===-- Implementation header of dladdr ------------------------*- C++ -*-===//
+//
+// 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_SRC_DLFCN_DLADDR_H
+#define LLVM_LIBC_SRC_DLFCN_DLADDR_H
+
+namespace LIBC_NAMESPACE {
+
+#include "include/llvm-libc-types/Dl_info.h"
+
+int dladdr(const void *, Dl_info *);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_DLFCN_DLADDR_H
diff --git a/libc/src/link/CMakeLists.txt b/libc/src/link/CMakeLists.txt
new file mode 100644
index 00000000000000..06f5e05e624fd6
--- /dev/null
+++ b/libc/src/link/CMakeLists.txt
@@ -0,0 +1,9 @@
+add_entrypoint_object(
+ dl_iterate_phdr
+ SRCS
+ dl_iterate_phdr.cpp
+ HDRS
+ dl_iterate_phdr.h
+ DEPENDS
+ libc.src.__support.common
+)
diff --git a/libc/src/link/dl_iterate_phdr.cpp b/libc/src/link/dl_iterate_phdr.cpp
new file mode 100644
index 00000000000000..7a723c097c47bc
--- /dev/null
+++ b/libc/src/link/dl_iterate_phdr.cpp
@@ -0,0 +1,20 @@
+//===-- Implementation of dl_iterate_phdr ---------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "dl_iterate_phdr.h"
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, dl_iterate_phdr,
+ (__dl_iterate_phdr_callback_t, void *)) {
+ // HACK(@izaakschroeder): Not implemented
+ return -1;
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/link/dl_iterate_phdr.h b/libc/src/link/dl_iterate_phdr.h
new file mode 100644
index 00000000000000..b7f7951e883a87
--- /dev/null
+++ b/libc/src/link/dl_iterate_phdr.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for dl_iterate_phdr ---------------*- C++ -*-===//
+//
+// 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_SRC_LINK_DL_ITERATE_PHDR_H
+#define LLVM_LIBC_SRC_LINK_DL_ITERATE_PHDR_H
+
+namespace LIBC_NAMESPACE {
+
+#include "include/llvm-libc-types/__dl_iterate_phdr_callback_t.h"
+
+int dl_iterate_phdr(__dl_iterate_phdr_callback_t, void *);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_LINK_DL_ITERATE_PHDR_H
More information about the libc-commits
mailing list