[haiku-commits] haiku: hrev56227 - headers/compatibility/bsd/sys src/libs/bsd

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 28 Jun 2022 17:08:41 +0000 (UTC)

hrev56227 adds 2 changesets to branch 'master'
old head: c5702ad4e84cf89a2a1066bc8a0054c3ef12d838
new head: 908107a15f63582157c7094be7273dbfffa1003c
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=908107a15f63+%5Ec5702ad4e84c

----------------------------------------------------------------------------

045f7a5f3aad: headers/bsd: Rewrite link_elf.h.
  
  Include only the APIs we are (shortly) going to actually support.
  
  The other structures and functions declared in this file were
  never supported nor used anywhere in Haiku's tree.

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

908107a15f63: libs/bsd: implemented dl_iterate_phdr
  
  dl_iterate_phdr now fills the first four fields of
  struct dl_phdr_info. The last four fields remain
  unimplemented, as it requires help from the
  runtime_loader.
  
  Change-Id: Id96a7c7ac05633a71b9fb62c98b3a40f7d4f255b
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                  [ Trung Nguyen <trungnt282910@xxxxxxxxx> ]

----------------------------------------------------------------------------

3 files changed, 79 insertions(+), 93 deletions(-)
headers/compatibility/bsd/sys/link_elf.h | 110 +++++----------------------
src/libs/bsd/Jamfile                     |   1 +
src/libs/bsd/dl_iterate_phdr.c           |  61 +++++++++++++++

############################################################################

Commit:      045f7a5f3aaddd0db49e2fdca4524a677c5cf76a
URL:         https://git.haiku-os.org/haiku/commit/?id=045f7a5f3aad
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Tue Jun 28 17:04:52 2022 UTC

headers/bsd: Rewrite link_elf.h.

Include only the APIs we are (shortly) going to actually support.

The other structures and functions declared in this file were
never supported nor used anywhere in Haiku's tree.

----------------------------------------------------------------------------

diff --git a/headers/compatibility/bsd/sys/link_elf.h 
b/headers/compatibility/bsd/sys/link_elf.h
index 916caefd16..7d01d03cf4 100644
--- a/headers/compatibility/bsd/sys/link_elf.h
+++ b/headers/compatibility/bsd/sys/link_elf.h
@@ -1,47 +1,12 @@
-/*-
- * SPDX-License-Identifier: BSD-4-Clause
- *
- * Copyright (c) 1993 Paul Kranenburg
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *      This product includes software developed by Paul Kranenburg.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
 /*
- * RRS section definitions.
- *
- * The layout of some data structures defined in this header file is
- * such that we can provide compatibility with the SunOS 4.x shared
- * library scheme.
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
  */
+#ifndef _BSD_SYS_LINK_ELF_H_
+#define        _BSD_SYS_LINK_ELF_H_
+
 
-#ifndef _SYS_LINK_ELF_H_
-#define        _SYS_LINK_ELF_H_
+#include <features.h>
 
 
 #ifdef _DEFAULT_SOURCE
@@ -49,69 +14,28 @@
 
 #include <os/kernel/elf.h>
 
-/*
- * Flags that describe the origin of the entries in Dl_serinfo.
- * SunOS has these in <sys/link.h>, we follow the suit.
- */
-#define        LA_SER_ORIG     0x01    /* original (needed) name */
-#define        LA_SER_LIBPATH  0x02    /* LD_LIBRARY_PATH entry prepended */
-#define        LA_SER_RUNPATH  0x04    /* runpath entry prepended */
-#define        LA_SER_CONFIG   0x08    /* configuration entry prepended */
-#define        LA_SER_DEFAULT  0x40    /* default path prepended */
-#define        LA_SER_SECURE   0x80    /* default (secure) path prepended */
-
-typedef struct link_map {
-       caddr_t         l_addr;                 /* Base Address of library */
-#ifdef __mips__
-       caddr_t         l_offs;                 /* Load Offset of library */
-#endif
-       const char      *l_name;                /* Absolute Path to Library */
-       const void      *l_ld;                  /* Pointer to .dynamic in 
memory */
-       struct link_map *l_next, *l_prev;       /* linked list of of mapped 
libs */
-} Link_map;
-
-struct r_debug {
-       int             r_version;              /* not used */
-       struct link_map *r_map;                 /* list of loaded images */
-       void            (*r_brk)(struct r_debug *, struct link_map *);
-                                               /* pointer to break point */
-       enum {
-               RT_CONSISTENT,                  /* things are stable */
-               RT_ADD,                         /* adding a shared library */
-               RT_DELETE                       /* removing a shared library */
-       }               r_state;
-};
 
-struct dl_phdr_info
-{
-       Elf_Addr dlpi_addr;                     /* module relocation base */
-       const char *dlpi_name;                  /* module name */
-       const Elf_Phdr *dlpi_phdr;              /* pointer to module's phdr */
-       Elf_Half dlpi_phnum;                    /* number of entries in phdr */
-       unsigned long long int dlpi_adds;       /* total # of loads */
-       unsigned long long int dlpi_subs;       /* total # of unloads */
-       size_t dlpi_tls_modid;
-       void *dlpi_tls_data;
+struct dl_phdr_info {
+       Elf_Addr dlpi_addr;
+       const char *dlpi_name;
+       const Elf_Phdr *dlpi_phdr;
+       Elf_Half dlpi_phnum;
 };
 
-#include <sys/cdefs.h>
 
-__BEGIN_DECLS
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 typedef int (*__dl_iterate_hdr_callback)(struct dl_phdr_info *, size_t, void 
*);
 extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void *);
-int _rtld_addr_phdr(const void *, struct dl_phdr_info *);
-int _rtld_get_stack_prot(void);
-int _rtld_is_dlopened(void *);
 
-#ifdef __ARM_EABI__
-void * dl_unwind_find_exidx(const void *, int *);
+#ifdef __cplusplus
+}
 #endif
 
-__END_DECLS
-
 
 #endif
 
 
-#endif /* _SYS_LINK_ELF_H_ */
+#endif /* _BSD_SYS_LINK_ELF_H_ */

############################################################################

Revision:    hrev56227
Commit:      908107a15f63582157c7094be7273dbfffa1003c
URL:         https://git.haiku-os.org/haiku/commit/?id=908107a15f63
Author:      Trung Nguyen <trungnt282910@xxxxxxxxx>
Date:        Thu May 26 13:48:56 2022 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Tue Jun 28 17:07:54 2022 UTC

libs/bsd: implemented dl_iterate_phdr

dl_iterate_phdr now fills the first four fields of
struct dl_phdr_info. The last four fields remain
unimplemented, as it requires help from the
runtime_loader.

Change-Id: Id96a7c7ac05633a71b9fb62c98b3a40f7d4f255b
Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/libs/bsd/Jamfile b/src/libs/bsd/Jamfile
index 3f22999240..1d3c7d836e 100644
--- a/src/libs/bsd/Jamfile
+++ b/src/libs/bsd/Jamfile
@@ -10,6 +10,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
 
                SharedLibrary [ MultiArchDefaultGristFiles libbsd.so ] :
                        daemon.c
+                       dl_iterate_phdr.c
                        err.c
                        explicit_bzero.c
                        fgetln.c
diff --git a/src/libs/bsd/dl_iterate_phdr.c b/src/libs/bsd/dl_iterate_phdr.c
new file mode 100644
index 0000000000..540c7c3152
--- /dev/null
+++ b/src/libs/bsd/dl_iterate_phdr.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Trung Nguyen, trungnt282910@xxxxxxxxx
+ */
+
+
+#include <kernel/image.h>
+#include <link.h>
+#include <stddef.h>
+
+
+#if B_HAIKU_32_BIT
+       typedef Elf32_Ehdr Elf_Ehdr;
+#elif B_HAIKU_64_BIT
+       typedef Elf64_Ehdr Elf_Ehdr;
+#endif
+
+
+// While get_next_image_info does not return the address of
+// the ELF header, it does return the first page of the image's
+// text segment (defined by runtime_loader as the first loaded page
+// with read-only protection). For most images produced by
+// normal compilers, including Haiku ELF files, the file header
+// is always loaded at the beginning of the text segment.
+//
+// We can therefore take advantage of this fact and populate
+// struct dl_phdr_info.
+int
+dl_iterate_phdr(int (*callback)(struct dl_phdr_info* info, size_t size, void* 
data), void* data)
+{
+       image_info info;
+       int32 cookie = 0;
+       int status;
+
+       struct dl_phdr_info phdr_info;
+
+       while (get_next_image_info(0, &cookie, &info) == B_OK) {
+               const Elf_Ehdr* header = (const Elf_Ehdr*)info.text;
+
+               // Check for the special commpage info (which is not an ELF 
image),
+               // and also guard against any maliciously crafted file which
+               // does not load its header in memory.
+               if (!IS_ELF(*header))
+                       continue;
+
+               phdr_info.dlpi_addr = (Elf_Addr)info.text;
+               phdr_info.dlpi_name = info.name;
+               phdr_info.dlpi_phnum = header->e_phnum;
+               phdr_info.dlpi_phdr = (const Elf_Phdr*)((const char*)info.text 
+ header->e_phoff);
+
+               status = callback(&phdr_info, sizeof(phdr_info), data);
+
+               if (status != 0)
+                       return status;
+       }
+
+       return 0;
+}


Other related posts:

  • » [haiku-commits] haiku: hrev56227 - headers/compatibility/bsd/sys src/libs/bsd - waddlesplash