Page MenuHomeFreeBSD

D20405.id.diff
No OneTemporary

D20405.id.diff

Index: head/usr.sbin/kldxref/kldxref.c
===================================================================
--- head/usr.sbin/kldxref/kldxref.c
+++ head/usr.sbin/kldxref/kldxref.c
@@ -549,9 +549,9 @@
{
struct mod_metadata md;
struct elf_file ef;
- void **p, **orgp;
+ void **p;
int error, eftype;
- long start, finish, entries;
+ long start, finish, entries, i;
char cval[MAXMODNAME + 1];
if (verbose || dflag)
@@ -575,18 +575,53 @@
&entries));
check(EF_SEG_READ_ENTRY_REL(&ef, start, sizeof(*p) * entries,
(void *)&p));
- orgp = p;
- while(entries--) {
- check(EF_SEG_READ_REL(&ef, (Elf_Off)*p, sizeof(md),
+ /*
+ * Do a first pass to find MDT_MODULE. It is required to be
+ * ordered first in the output linker.hints stream because it
+ * serves as an implicit record boundary between distinct klds
+ * in the stream. Other MDTs only make sense in the context of
+ * a specific MDT_MODULE.
+ *
+ * Some compilers (e.g., GCC 6.4.0 xtoolchain) or binutils
+ * (e.g., GNU binutils 2.32 objcopy/ld.bfd) can reorder
+ * MODULE_METADATA set entries relative to the source ordering.
+ * This is permitted by the C standard; memory layout of
+ * file-scope objects is left implementation-defined. There is
+ * no requirement that source code ordering is retained.
+ *
+ * Handle that here by taking two passes to ensure MDT_MODULE
+ * records are emitted to linker.hints before other MDT records
+ * in the same kld.
+ */
+ for (i = 0; i < entries; i++) {
+ check(EF_SEG_READ_REL(&ef, (Elf_Off)p[i], sizeof(md),
&md));
- p++;
check(EF_SEG_READ_STRING(&ef, (Elf_Off)md.md_cval,
sizeof(cval), cval));
- parse_entry(&md, cval, &ef, kldname);
+ if (md.md_type == MDT_MODULE) {
+ parse_entry(&md, cval, &ef, kldname);
+ break;
+ }
}
+ if (error != 0) {
+ warnc(error, "error while reading %s", filename);
+ break;
+ }
+
+ /*
+ * Second pass for all !MDT_MODULE entries.
+ */
+ for (i = 0; i < entries; i++) {
+ check(EF_SEG_READ_REL(&ef, (Elf_Off)p[i], sizeof(md),
+ &md));
+ check(EF_SEG_READ_STRING(&ef, (Elf_Off)md.md_cval,
+ sizeof(cval), cval));
+ if (md.md_type != MDT_MODULE)
+ parse_entry(&md, cval, &ef, kldname);
+ }
if (error != 0)
warnc(error, "error while reading %s", filename);
- free(orgp);
+ free(p);
} while(0);
EF_CLOSE(&ef);
return (error);

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 28, 3:03 PM (13 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32286755
Default Alt Text
D20405.id.diff (2 KB)

Event Timeline