Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F154314610
D47383.id145831.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D47383.id145831.diff
View Options
diff --git a/lib/libkldelf/ef_obj.c b/lib/libkldelf/ef_obj.c
--- a/lib/libkldelf/ef_obj.c
+++ b/lib/libkldelf/ef_obj.c
@@ -276,6 +276,7 @@
size_t i, nshdr;
int error, pb, ra, rl;
int j, nsym, symstrindex, symtabindex;
+ bool incorelayout;
hdr = &efile->ef_hdr;
if (hdr->e_type != ET_REL || hdr->e_shnum == 0 || hdr->e_shoff == 0 ||
@@ -285,6 +286,7 @@
ef = calloc(1, sizeof(*ef));
if (ef == NULL)
return (errno);
+ incorelayout = (efile->ef_flags & KELF_F_OINCORELAYOUT) != 0;
efile->ef_ef = ef;
efile->ef_ops = &ef_obj_file_ops;
@@ -304,9 +306,16 @@
symtabindex = -1;
symstrindex = -1;
for (i = 0; i < nshdr; i++) {
+ if (incorelayout && shdr[i].sh_size == 0)
+ continue;
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+ case SHT_X86_64_UNWIND:
+ case SHT_INIT_ARRAY:
+ case SHT_FINI_ARRAY:
+ if (incorelayout && (shdr[i].sh_flags & SHF_ALLOC) == 0)
+ break;
ef->nprogtab++;
break;
case SHT_SYMTAB:
@@ -385,9 +394,16 @@
ra = 0;
mapbase = 0;
for (i = 0; i < nshdr; i++) {
+ if (incorelayout && shdr[i].sh_size == 0)
+ continue;
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+ case SHT_X86_64_UNWIND:
+ case SHT_INIT_ARRAY:
+ case SHT_FINI_ARRAY:
+ if (incorelayout && (shdr[i].sh_flags & SHF_ALLOC) == 0)
+ break;
mapbase = roundup2(mapbase, shdr[i].sh_addralign);
ef->progtab[pb].addr = mapbase;
if (shdr[i].sh_type == SHT_PROGBITS) {
diff --git a/lib/libkldelf/elf.c b/lib/libkldelf/elf.c
--- a/lib/libkldelf/elf.c
+++ b/lib/libkldelf/elf.c
@@ -63,12 +63,14 @@
}
int
-elf_open_file(struct elf_file *efile, const char *filename, int verbose)
+elf_open_file(struct elf_file *efile, const char *filename, unsigned int flags,
+ int verbose)
{
int error;
memset(efile, 0, sizeof(*efile));
efile->ef_filename = filename;
+ efile->ef_flags = flags;
efile->ef_fd = open(filename, O_RDONLY);
if (efile->ef_fd == -1) {
if (verbose)
diff --git a/lib/libkldelf/kldelf.h b/lib/libkldelf/kldelf.h
--- a/lib/libkldelf/kldelf.h
+++ b/lib/libkldelf/kldelf.h
@@ -101,6 +101,7 @@
elf_reloc_t *ef_reloc;
GElf_Ehdr ef_hdr;
size_t ef_pointer_size;
+ unsigned int ef_flags;
int ef_fd;
};
@@ -153,12 +154,15 @@
* use libelf.
*/
+/* For an object file, load the image as how it is loaded by kernel linker */
+#define KELF_F_OINCORELAYOUT (1 << 1u)
+
/*
* Open an ELF file with libelf. Populates fields other than ef_ef
* and ef_ops in '*efile'.
*/
int elf_open_file(struct elf_file *efile, const char *filename,
- int verbose);
+ unsigned int flags, int verbose);
/* Close an ELF file. */
void elf_close_file(struct elf_file *efile);
diff --git a/usr.sbin/kldxref/kldxref.c b/usr.sbin/kldxref/kldxref.c
--- a/usr.sbin/kldxref/kldxref.c
+++ b/usr.sbin/kldxref/kldxref.c
@@ -640,7 +640,7 @@
if (verbose || dflag)
printf("%s\n", filename);
- error = elf_open_file(&ef, filename, verbose);
+ error = elf_open_file(&ef, filename, 0, verbose);
if (error != 0)
return (error);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 28, 7:03 PM (14 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32300230
Default Alt Text
D47383.id145831.diff (2 KB)
Attached To
Mode
D47383: libkldelf: skip loading zero-sized and non-SHF_ALLOC sections
Attached
Detach File
Event Timeline
Log In to Comment