Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 26874
b: refs/heads/master
c: 2c1a51f
h: refs/heads/master
v: v3
  • Loading branch information
Atsushi Nemoto authored and Linus Torvalds committed May 21, 2006
1 parent 3cec81f commit 23821f1
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 92f63cd000059366af18712367216d96180e0ec0
refs/heads/master: 2c1a51f39d9551a514d7a089d01c23c0c3a54ab8
65 changes: 46 additions & 19 deletions trunk/scripts/mod/modpost.c
Original file line number Diff line number Diff line change
Expand Up @@ -697,29 +697,56 @@ static void check_sec_ref(struct module *mod, const char *modname,

/* Walk through all sections */
for (i = 0; i < hdr->e_shnum; i++) {
Elf_Rela *rela;
Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset;
Elf_Rela *stop = (void*)start + sechdrs[i].sh_size;
const char *name = secstrings + sechdrs[i].sh_name +
strlen(".rela");
const char *name = secstrings + sechdrs[i].sh_name;
const char *secname;
Elf_Rela r;
/* We want to process only relocation sections and not .init */
if (section_ref_ok(name) || (sechdrs[i].sh_type != SHT_RELA))
continue;
if (sechdrs[i].sh_type == SHT_RELA) {
Elf_Rela *rela;
Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset;
Elf_Rela *stop = (void*)start + sechdrs[i].sh_size;
name += strlen(".rela");
if (section_ref_ok(name))
continue;

for (rela = start; rela < stop; rela++) {
Elf_Rela r;
const char *secname;
r.r_offset = TO_NATIVE(rela->r_offset);
r.r_info = TO_NATIVE(rela->r_info);
r.r_addend = TO_NATIVE(rela->r_addend);
sym = elf->symtab_start + ELF_R_SYM(r.r_info);
/* Skip special sections */
if (sym->st_shndx >= SHN_LORESERVE)
for (rela = start; rela < stop; rela++) {
r.r_offset = TO_NATIVE(rela->r_offset);
r.r_info = TO_NATIVE(rela->r_info);
r.r_addend = TO_NATIVE(rela->r_addend);
sym = elf->symtab_start + ELF_R_SYM(r.r_info);
/* Skip special sections */
if (sym->st_shndx >= SHN_LORESERVE)
continue;

secname = secstrings +
sechdrs[sym->st_shndx].sh_name;
if (section(secname))
warn_sec_mismatch(modname, name,
elf, sym, r);
}
} else if (sechdrs[i].sh_type == SHT_REL) {
Elf_Rel *rel;
Elf_Rel *start = (void *)hdr + sechdrs[i].sh_offset;
Elf_Rel *stop = (void*)start + sechdrs[i].sh_size;
name += strlen(".rel");
if (section_ref_ok(name))
continue;

secname = secstrings + sechdrs[sym->st_shndx].sh_name;
if (section(secname))
warn_sec_mismatch(modname, name, elf, sym, r);
for (rel = start; rel < stop; rel++) {
r.r_offset = TO_NATIVE(rel->r_offset);
r.r_info = TO_NATIVE(rel->r_info);
r.r_addend = 0;
sym = elf->symtab_start + ELF_R_SYM(r.r_info);
/* Skip special sections */
if (sym->st_shndx >= SHN_LORESERVE)
continue;

secname = secstrings +
sechdrs[sym->st_shndx].sh_name;
if (section(secname))
warn_sec_mismatch(modname, name,
elf, sym, r);
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions trunk/scripts/mod/modpost.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#define ELF_ST_BIND ELF32_ST_BIND
#define ELF_ST_TYPE ELF32_ST_TYPE

#define Elf_Rel Elf32_Rel
#define Elf_Rela Elf32_Rela
#define ELF_R_SYM ELF32_R_SYM
#define ELF_R_TYPE ELF32_R_TYPE
Expand All @@ -34,6 +35,7 @@
#define ELF_ST_BIND ELF64_ST_BIND
#define ELF_ST_TYPE ELF64_ST_TYPE

#define Elf_Rel Elf64_Rel
#define Elf_Rela Elf64_Rela
#define ELF_R_SYM ELF64_R_SYM
#define ELF_R_TYPE ELF64_R_TYPE
Expand Down

0 comments on commit 23821f1

Please sign in to comment.