Hi Ard,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v4.18-rc3 next-20180702]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Ard-Biesheuvel/add-support-for-relative-references-in-jump-tables/20180703-031712
config: um-x86_64_defconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=um SUBARCH=x86_64

All errors (new ones prefixed by >>):

   arch/x86/um/../kernel/module.c: In function 'apply_relocate_add':
>> arch/x86/um/../kernel/module.c:204:8: error: 'R_X86_64_PC64' undeclared 
>> (first use in this function); did you mean 'R_X86_64_PC16'?
      case R_X86_64_PC64:
           ^~~~~~~~~~~~~
           R_X86_64_PC16
   arch/x86/um/../kernel/module.c:204:8: note: each undeclared identifier is 
reported only once for each function it appears in

vim +204 arch/x86/um/../kernel/module.c

    99  
   100  #ifdef CONFIG_X86_32
   101  int apply_relocate(Elf32_Shdr *sechdrs,
   102                     const char *strtab,
   103                     unsigned int symindex,
   104                     unsigned int relsec,
   105                     struct module *me)
   106  {
   107          unsigned int i;
   108          Elf32_Rel *rel = (void *)sechdrs[relsec].sh_addr;
   109          Elf32_Sym *sym;
   110          uint32_t *location;
   111  
   112          DEBUGP("Applying relocate section %u to %u\n",
   113                 relsec, sechdrs[relsec].sh_info);
   114          for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
   115                  /* This is where to make the change */
   116                  location = (void 
*)sechdrs[sechdrs[relsec].sh_info].sh_addr
   117                          + rel[i].r_offset;
   118                  /* This is the symbol it is referring to.  Note that all
   119                     undefined symbols have been resolved.  */
   120                  sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
   121                          + ELF32_R_SYM(rel[i].r_info);
   122  
   123                  switch (ELF32_R_TYPE(rel[i].r_info)) {
   124                  case R_386_32:
   125                          /* We add the value into the location given */
   126                          *location += sym->st_value;
   127                          break;
   128                  case R_386_PC32:
   129                          /* Add the value, subtract its position */
   130                          *location += sym->st_value - (uint32_t)location;
   131                          break;
   132                  default:
   133                          pr_err("%s: Unknown relocation: %u\n",
   134                                 me->name, ELF32_R_TYPE(rel[i].r_info));
   135                          return -ENOEXEC;
   136                  }
   137          }
   138          return 0;
   139  }
   140  #else /*X86_64*/
   141  int apply_relocate_add(Elf64_Shdr *sechdrs,
   142                     const char *strtab,
   143                     unsigned int symindex,
   144                     unsigned int relsec,
   145                     struct module *me)
   146  {
   147          unsigned int i;
   148          Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr;
   149          Elf64_Sym *sym;
   150          void *loc;
   151          u64 val;
   152  
   153          DEBUGP("Applying relocate section %u to %u\n",
   154                 relsec, sechdrs[relsec].sh_info);
   155          for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
   156                  /* This is where to make the change */
   157                  loc = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
   158                          + rel[i].r_offset;
   159  
   160                  /* This is the symbol it is referring to.  Note that all
   161                     undefined symbols have been resolved.  */
   162                  sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
   163                          + ELF64_R_SYM(rel[i].r_info);
   164  
   165                  DEBUGP("type %d st_value %Lx r_addend %Lx loc %Lx\n",
   166                         (int)ELF64_R_TYPE(rel[i].r_info),
   167                         sym->st_value, rel[i].r_addend, (u64)loc);
   168  
   169                  val = sym->st_value + rel[i].r_addend;
   170  
   171                  switch (ELF64_R_TYPE(rel[i].r_info)) {
   172                  case R_X86_64_NONE:
   173                          break;
   174                  case R_X86_64_64:
   175                          if (*(u64 *)loc != 0)
   176                                  goto invalid_relocation;
   177                          *(u64 *)loc = val;
   178                          break;
   179                  case R_X86_64_32:
   180                          if (*(u32 *)loc != 0)
   181                                  goto invalid_relocation;
   182                          *(u32 *)loc = val;
   183                          if (val != *(u32 *)loc)
   184                                  goto overflow;
   185                          break;
   186                  case R_X86_64_32S:
   187                          if (*(s32 *)loc != 0)
   188                                  goto invalid_relocation;
   189                          *(s32 *)loc = val;
   190                          if ((s64)val != *(s32 *)loc)
   191                                  goto overflow;
   192                          break;
   193                  case R_X86_64_PC32:
   194                  case R_X86_64_PLT32:
   195                          if (*(u32 *)loc != 0)
   196                                  goto invalid_relocation;
   197                          val -= (u64)loc;
   198                          *(u32 *)loc = val;
   199  #if 0
   200                          if ((s64)val != *(s32 *)loc)
   201                                  goto overflow;
   202  #endif
   203                          break;
 > 204                  case R_X86_64_PC64:
   205                          if (*(u64 *)loc != 0)
   206                                  goto invalid_relocation;
   207                          val -= (u64)loc;
   208                          *(u64 *)loc = val;
   209                          break;
   210                  default:
   211                          pr_err("%s: Unknown rela relocation: %llu\n",
   212                                 me->name, ELF64_R_TYPE(rel[i].r_info));
   213                          return -ENOEXEC;
   214                  }
   215          }
   216          return 0;
   217  
   218  invalid_relocation:
   219          pr_err("x86/modules: Skipping invalid relocation target, 
existing value is nonzero for type %d, loc %p, val %Lx\n",
   220                 (int)ELF64_R_TYPE(rel[i].r_info), loc, val);
   221          return -ENOEXEC;
   222  
   223  overflow:
   224          pr_err("overflow in relocation type %d val %Lx\n",
   225                 (int)ELF64_R_TYPE(rel[i].r_info), val);
   226          pr_err("`%s' likely not compiled with -mcmodel=kernel\n",
   227                 me->name);
   228          return -ENOEXEC;
   229  }
   230  #endif
   231  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to