Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F108245125
D44093.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D44093.diff
View Options
diff --git a/sbin/ldconfig/elfhints.c b/sbin/ldconfig/elfhints.c
--- a/sbin/ldconfig/elfhints.c
+++ b/sbin/ldconfig/elfhints.c
@@ -27,6 +27,7 @@
*/
#include <sys/param.h>
+#include <sys/endian.h>
#include <sys/mman.h>
#include <sys/stat.h>
@@ -48,11 +49,12 @@
static void add_dir(const char *, const char *, bool);
static void read_dirs_from_file(const char *, const char *);
-static void read_elf_hints(const char *, bool);
+static void read_elf_hints(const char *, bool, bool);
static void write_elf_hints(const char *);
static const char *dirs[MAXDIRS];
static int ndirs;
+static bool is_be;
bool insecure;
static void
@@ -95,7 +97,7 @@
int i;
int nlibs;
- read_elf_hints(hintsfile, 1);
+ read_elf_hints(hintsfile, true, false);
printf("%s:\n", hintsfile);
printf("\tsearch directories:");
for (i = 0; i < ndirs; i++)
@@ -183,8 +185,11 @@
fclose(fp);
}
+/* Convert between native byte order and forced little resp. big endian. */
+#define COND_SWAP(n) (is_be ? be32toh(n) : le32toh(n))
+
static void
-read_elf_hints(const char *hintsfile, bool must_exist)
+read_elf_hints(const char *hintsfile, bool must_exist, bool force_be)
{
int fd;
struct stat s;
@@ -193,6 +198,7 @@
char *strtab;
char *dirlist;
char *p;
+ int hdr_version;
if ((fd = open(hintsfile, O_RDONLY)) == -1) {
if (errno == ENOENT && !must_exist)
@@ -214,14 +220,18 @@
close(fd);
hdr = (struct elfhints_hdr *)mapbase;
- if (hdr->magic != ELFHINTS_MAGIC)
+ is_be = be32toh(hdr->magic) == ELFHINTS_MAGIC;
+ if (COND_SWAP(hdr->magic) != ELFHINTS_MAGIC)
errx(1, "\"%s\": invalid file format", hintsfile);
- if (hdr->version != 1)
+ if (force_be && !is_be)
+ errx(1, "\"%s\": incompatible endianness requested", hintsfile);
+ hdr_version = COND_SWAP(hdr->version);
+ if (hdr_version != 1)
errx(1, "\"%s\": unrecognized file version (%d)", hintsfile,
- hdr->version);
+ hdr_version);
- strtab = (char *)mapbase + hdr->strtab;
- dirlist = strtab + hdr->dirlist;
+ strtab = (char *)mapbase + COND_SWAP(hdr->strtab);
+ dirlist = strtab + COND_SWAP(hdr->dirlist);
if (*dirlist != '\0')
while ((p = strsep(&dirlist, ":")) != NULL)
@@ -229,13 +239,19 @@
}
void
-update_elf_hints(const char *hintsfile, int argc, char **argv, bool merge)
+update_elf_hints(const char *hintsfile, int argc, char **argv, bool merge,
+ bool force_be)
{
struct stat s;
int i;
+ /*
+ * Remove "be32toh(1) == 1" from this condition to create
+ * little-endian hints files on all architectures by default.
+ */
+ is_be = be32toh(1) == 1 || force_be;
if (merge)
- read_elf_hints(hintsfile, false);
+ read_elf_hints(hintsfile, false, force_be);
for (i = 0; i < argc; i++) {
if (stat(argv[i], &s) == -1)
warn("warning: %s", argv[i]);
@@ -265,9 +281,9 @@
if ((fp = fdopen(fd, "wb")) == NULL)
err(1, "fdopen(%s)", tempname);
- hdr.magic = ELFHINTS_MAGIC;
- hdr.version = 1;
- hdr.strtab = sizeof hdr;
+ hdr.magic = COND_SWAP(ELFHINTS_MAGIC);
+ hdr.version = COND_SWAP(1);
+ hdr.strtab = COND_SWAP(sizeof hdr);
hdr.strsize = 0;
hdr.dirlist = 0;
memset(hdr.spare, 0, sizeof hdr.spare);
@@ -278,8 +294,10 @@
for (i = 1; i < ndirs; i++)
hdr.strsize += 1 + strlen(dirs[i]);
}
- hdr.dirlistlen = hdr.strsize;
+ hdr.dirlistlen = COND_SWAP(hdr.strsize);
hdr.strsize++; /* For the null terminator */
+ /* convert in-place from native to target endianness */
+ hdr.strsize = COND_SWAP(hdr.strsize);
/* Write the header. */
if (fwrite(&hdr, 1, sizeof hdr, fp) != sizeof hdr)
diff --git a/sbin/ldconfig/ldconfig.h b/sbin/ldconfig/ldconfig.h
--- a/sbin/ldconfig/ldconfig.h
+++ b/sbin/ldconfig/ldconfig.h
@@ -36,7 +36,7 @@
__BEGIN_DECLS
void list_elf_hints(const char *);
-void update_elf_hints(const char *, int, char **, bool);
+void update_elf_hints(const char *, int, char **, bool, bool);
__END_DECLS
#endif
diff --git a/sbin/ldconfig/ldconfig.8 b/sbin/ldconfig/ldconfig.8
--- a/sbin/ldconfig/ldconfig.8
+++ b/sbin/ldconfig/ldconfig.8
@@ -32,7 +32,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd May 15, 2021
+.Dd February 28, 2024
.Dt LDCONFIG 8
.Os
.Sh NAME
@@ -41,7 +41,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl 32
-.Op Fl Rimrv
+.Op Fl BRimrv
.Op Fl f Ar hints_file
.Op Ar directory | Ar
.Sh DESCRIPTION
@@ -105,6 +105,11 @@
on 64-bit systems that support running 32-bit binaries.
.It Fl elf
Ignored for backwards compatibility.
+.It Fl B
+Force writing big-endian binary data´to the hints file.
+The default is to create little-endian hints files on all architectures.
+Reading of and merging into hints files preserves the endianness of the
+existing hints file.
.It Fl R
Appends pathnames on the command line to the directory list from
the hints file.
@@ -159,7 +164,7 @@
.El
.Sh SEE ALSO
.Xr ld 1 ,
-.Xr ld-elf.so.1 ,
+.Xr ld-elf.so.1 1 ,
.Xr link 5
.Sh HISTORY
A
diff --git a/sbin/ldconfig/ldconfig.c b/sbin/ldconfig/ldconfig.c
--- a/sbin/ldconfig/ldconfig.c
+++ b/sbin/ldconfig/ldconfig.c
@@ -57,9 +57,9 @@
{
const char *hints_file;
int c;
- bool is_32, justread, merge, rescan, verbose;
+ bool is_32, justread, merge, rescan, force_be, verbose;
- is_32 = justread = merge = rescan = verbose = false;
+ force_be = is_32 = justread = merge = rescan = verbose = false;
while (argc > 1) {
if (strcmp(argv[1], "-aout") == 0) {
@@ -80,8 +80,11 @@
hints_file = __PATH_ELF_HINTS("32");
else
hints_file = _PATH_ELF_HINTS;
- while((c = getopt(argc, argv, "Rf:imrsv")) != -1) {
+ while((c = getopt(argc, argv, "BRf:imrsv")) != -1) {
switch (c) {
+ case 'B':
+ force_be = true;
+ break;
case 'R':
rescan = true;
break;
@@ -115,7 +118,7 @@
if (argc == optind)
rescan = true;
update_elf_hints(hints_file, argc - optind,
- argv + optind, merge || rescan);
+ argv + optind, merge || rescan, force_be);
}
exit(0);
}
@@ -124,7 +127,7 @@
usage(void)
{
fprintf(stderr,
- "usage: ldconfig [-32] [-elf] [-Rimrv] [-f hints_file] "
+ "usage: ldconfig [-32] [-elf] [-BRimrv] [-f hints_file]"
"[directory | file ...]\n");
exit(1);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jan 24, 1:39 AM (21 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16070642
Default Alt Text
D44093.diff (6 KB)
Attached To
Mode
D44093: Make ldconfig support hints files of either byte-order
Attached
Detach File
Event Timeline
Log In to Comment