Skip to content
  • Jack Carter's avatar
    The ELF relocation record format is different for N64 · 8ad0c272
    Jack Carter authored
    which many Mips 64 ABIs use than for O64 which many 
    if not all other target ABIs use.
    
    Most architectures have the following 64 bit relocation record format:
    
      typedef struct
      {
        Elf64_Addr   r_offset; /* Address of reference */
        Elf64_Xword  r_info;   /* Symbol index and type of relocation */
      } Elf64_Rel;
    
      typedef struct
      {
        Elf64_Addr    r_offset;
        Elf64_Xword   r_info;
        Elf64_Sxword  r_addend;
      } Elf64_Rela;
    
    Whereas N64 has the following format:
    
      typedef struct
      {
        Elf64_Addr    r_offset;/* Address of reference */
        Elf64_Word  r_sym;     /* Symbol index */
        Elf64_Byte  r_ssym;    /* Special symbol */
        Elf64_Byte  r_type3;   /* Relocation type */
        Elf64_Byte  r_type2;   /* Relocation type */
        Elf64_Byte  r_type;    /* Relocation type */
      } Elf64_Rel;
    
      typedef struct
      {
        Elf64_Addr    r_offset;/* Address of reference */
        Elf64_Word  r_sym;     /* Symbol index */
        Elf64_Byte  r_ssym;    /* Special symbol */
        Elf64_Byte  r_type3;   /* Relocation type */
        Elf64_Byte  r_type2;   /* Relocation type */
        Elf64_Byte  r_type;    /* Relocation type */
        Elf64_Sxword  r_addend;
      } Elf64_Rela;
    
    The structure is the same size, but the r_info data element 
    is now 5 separate elements. Besides the content aspects, 
    endian byte reordering will be different for the area with 
    each element being endianized separately.
    
    I treat this as generic and continue to pass r_type as 
    an integer masking and unmasking the byte sized N64 
    values for N64 mode. I've implemented this and it causes no 
    affect on other current targets.
    
    This passes make check.
    
    Jack
    
    llvm-svn: 159299
    8ad0c272
Loading