Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109669291
D29550.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D29550.diff
View Options
diff --git a/usr.bin/elfctl/elfctl.c b/usr.bin/elfctl/elfctl.c
--- a/usr.bin/elfctl/elfctl.c
+++ b/usr.bin/elfctl/elfctl.c
@@ -52,10 +52,10 @@
__FBSDID("$FreeBSD$");
static bool convert_to_feature_val(char *, uint32_t *);
-static bool edit_file_features(Elf *, int, int, char *);
-static bool get_file_features(Elf *, int, int, uint32_t *, uint64_t *);
+static bool edit_file_features(Elf *, int, int, char *, bool);
+static bool get_file_features(Elf *, int, int, uint32_t *, uint64_t *, bool);
static void print_features(void);
-static bool print_file_features(Elf *, int, int, char *);
+static bool print_file_features(Elf *, int, int, char *, bool);
static void usage(void);
struct ControlFeatures {
@@ -81,9 +81,11 @@
};
#if BYTE_ORDER == LITTLE_ENDIAN
-#define SUPPORTED_ENDIAN ELFDATA2LSB
+#define HOST_ENDIAN ELFDATA2LSB
+#define SWAP_ENDIAN ELFDATA2MSB
#else
-#define SUPPORTED_ENDIAN ELFDATA2MSB
+#define HOST_ENDIAN ELFDATA2MSB
+#define SWAP_ENDIAN ELFDATA2LSB
#endif
static bool iflag;
@@ -96,7 +98,7 @@
Elf_Kind kind;
int ch, fd, retval;
char *features;
- bool editfeatures, lflag;
+ bool editfeatures, lflag, endian_swap;
lflag = 0;
editfeatures = false;
@@ -165,24 +167,25 @@
retval = 1;
goto fail;
}
- /*
- * XXX need to support cross-endian operation, but for now
- * exit on error rather than misbehaving.
- */
- if (ehdr.e_ident[EI_DATA] != SUPPORTED_ENDIAN) {
- warnx("file endianness must match host");
+
+ if (ehdr.e_ident[EI_DATA] == HOST_ENDIAN) {
+ endian_swap = false;
+ } else if (ehdr.e_ident[EI_DATA] == SWAP_ENDIAN) {
+ endian_swap = true;
+ } else {
+ warnx("file endianness unknown");
retval = 1;
goto fail;
}
if (!editfeatures) {
if (!print_file_features(elf, ehdr.e_phnum, fd,
- argv[0])) {
+ argv[0], endian_swap)) {
retval = 1;
goto fail;
}
} else if (!edit_file_features(elf, ehdr.e_phnum, fd,
- features)) {
+ features, endian_swap)) {
retval = 1;
goto fail;
}
@@ -286,12 +289,13 @@
}
static bool
-edit_file_features(Elf *elf, int phcount, int fd, char *val)
+edit_file_features(Elf *elf, int phcount, int fd, char *val, bool endian_swap)
{
uint32_t features;
uint64_t off;
- if (!get_file_features(elf, phcount, fd, &features, &off)) {
+ if (!get_file_features(elf, phcount, fd, &features, &off,
+ endian_swap)) {
warnx("NT_FREEBSD_FEATURE_CTL note not found");
return (false);
}
@@ -299,6 +303,9 @@
if (!convert_to_feature_val(val, &features))
return (false);
+ if (endian_swap)
+ features = bswap32(features);
+
if (lseek(fd, off, SEEK_SET) == -1 ||
write(fd, &features, sizeof(features)) <
(ssize_t)sizeof(features)) {
@@ -320,12 +327,14 @@
}
static bool
-print_file_features(Elf *elf, int phcount, int fd, char *filename)
+print_file_features(Elf *elf, int phcount, int fd, char *filename,
+ bool endian_swap)
{
uint32_t features;
unsigned long i;
- if (!get_file_features(elf, phcount, fd, &features, NULL)) {
+ if (!get_file_features(elf, phcount, fd, &features, NULL,
+ endian_swap)) {
return (false);
}
@@ -344,7 +353,7 @@
static bool
get_file_features(Elf *elf, int phcount, int fd, uint32_t *features,
- uint64_t *off)
+ uint64_t *off, bool endian_swap)
{
GElf_Phdr phdr;
Elf_Note note;
@@ -379,6 +388,12 @@
}
read_total += sizeof(note);
+ if (endian_swap) {
+ note.n_namesz = bswap32(note.n_namesz);
+ note.n_descsz = bswap32(note.n_descsz);
+ note.n_type = bswap32(note.n_type);
+ }
+
/*
* XXX: Name and descriptor are 4 byte aligned, however,
* the size given doesn't include the padding.
@@ -430,6 +445,8 @@
free(name);
return (false);
}
+ if (endian_swap)
+ *features = bswap32(*features);
if (off != NULL)
*off = phdr.p_offset + read_total;
free(name);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Feb 9, 4:08 AM (1 m, 56 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16542872
Default Alt Text
D29550.diff (3 KB)
Attached To
Mode
D29550: usr.bin/elfctl: Allow for cross-endian operations.
Attached
Detach File
Event Timeline
Log In to Comment