Page MenuHomeFreeBSD

D29049.diff
No OneTemporary

D29049.diff

diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -386,6 +386,8 @@
#ifdef __amd64__
case SHT_X86_64_UNWIND:
#endif
+ case SHT_INIT_ARRAY:
+ case SHT_FINI_ARRAY:
/* Ignore sections not loaded by the loader. */
if (shdr[i].sh_addr == 0)
break;
@@ -470,6 +472,7 @@
#ifdef __amd64__
case SHT_X86_64_UNWIND:
#endif
+ case SHT_FINI_ARRAY:
if (shdr[i].sh_addr == 0)
break;
ef->progtab[pb].addr = (void *)shdr[i].sh_addr;
@@ -479,6 +482,10 @@
else if (shdr[i].sh_type == SHT_X86_64_UNWIND)
ef->progtab[pb].name = "<<UNWIND>>";
#endif
+ else if (shdr[i].sh_type == SHT_INIT_ARRAY)
+ ef->progtab[pb].name = "<<INIT_ARRAY>>";
+ else if (shdr[i].sh_type == SHT_FINI_ARRAY)
+ ef->progtab[pb].name = "<<FINI_ARRAY>>";
else
ef->progtab[pb].name = "<<NOBITS>>";
ef->progtab[pb].size = shdr[i].sh_size;
@@ -525,10 +532,17 @@
vnet_data_copy(vnet_data, shdr[i].sh_size);
ef->progtab[pb].addr = vnet_data;
#endif
- } else if (ef->progtab[pb].name != NULL &&
- !strcmp(ef->progtab[pb].name, ".ctors")) {
- lf->ctors_addr = ef->progtab[pb].addr;
- lf->ctors_size = shdr[i].sh_size;
+ } else if ((ef->progtab[pb].name != NULL &&
+ strcmp(ef->progtab[pb].name, ".ctors") == 0) ||
+ shdr[i].sh_type == SHT_INIT_ARRAY) {
+ if (lf->ctors_addr != 0) {
+ printf(
+ "%s: multiple ctor sections in %s\n",
+ __func__, filename);
+ } else {
+ lf->ctors_addr = ef->progtab[pb].addr;
+ lf->ctors_size = shdr[i].sh_size;
+ }
}
/* Update all symbol values with the offset. */
@@ -773,6 +787,8 @@
#ifdef __amd64__
case SHT_X86_64_UNWIND:
#endif
+ case SHT_INIT_ARRAY:
+ case SHT_FINI_ARRAY:
if ((shdr[i].sh_flags & SHF_ALLOC) == 0)
break;
ef->nprogtab++;
@@ -894,6 +910,8 @@
#ifdef __amd64__
case SHT_X86_64_UNWIND:
#endif
+ case SHT_INIT_ARRAY:
+ case SHT_FINI_ARRAY:
if ((shdr[i].sh_flags & SHF_ALLOC) == 0)
break;
alignmask = shdr[i].sh_addralign - 1;
@@ -971,6 +989,8 @@
#ifdef __amd64__
case SHT_X86_64_UNWIND:
#endif
+ case SHT_INIT_ARRAY:
+ case SHT_FINI_ARRAY:
if ((shdr[i].sh_flags & SHF_ALLOC) == 0)
break;
alignmask = shdr[i].sh_addralign - 1;
@@ -979,9 +999,18 @@
if (ef->shstrtab != NULL && shdr[i].sh_name != 0) {
ef->progtab[pb].name =
ef->shstrtab + shdr[i].sh_name;
- if (!strcmp(ef->progtab[pb].name, ".ctors")) {
- lf->ctors_addr = (caddr_t)mapbase;
- lf->ctors_size = shdr[i].sh_size;
+ if (!strcmp(ef->progtab[pb].name, ".ctors") ||
+ shdr[i].sh_type == SHT_INIT_ARRAY) {
+ if (lf->ctors_addr != 0) {
+ printf(
+ "%s: multiple ctor sections in %s\n",
+ __func__, filename);
+ } else {
+ lf->ctors_addr =
+ (caddr_t)mapbase;
+ lf->ctors_size =
+ shdr[i].sh_size;
+ }
}
} else if (shdr[i].sh_type == SHT_PROGBITS)
ef->progtab[pb].name = "<<PROGBITS>>";

File Metadata

Mime Type
text/plain
Expires
Tue, Jan 20, 2:52 AM (18 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27758111
Default Alt Text
D29049.diff (2 KB)

Event Timeline