int elfreloc1(Reloc *r, vlong off, int32 elfsym, vlong add) { VPUT(off); switch(r->type) { default: return -1; case D_ADDR: if(r->siz == 4) VPUT(R_X86_64_32 | (uint64)elfsym<<32); else if(r->siz == 8) VPUT(R_X86_64_64 | (uint64)elfsym<<32); else return -1; break; case D_PCREL: if(r->siz == 4) VPUT(R_X86_64_PC32 | (uint64)elfsym<<32); else return -1; add -= r->siz; break; } VPUT(add); return 0; }
int elfreloc1(Reloc *r, vlong sectoff) { int32 elfsym; VPUT(sectoff); elfsym = r->xsym->elfsym; switch(r->type) { default: return -1; case R_ADDR: if(r->siz == 4) VPUT(R_X86_64_32 | (uint64)elfsym<<32); else if(r->siz == 8) VPUT(R_X86_64_64 | (uint64)elfsym<<32); else return -1; break; case R_TLS_LE: if(r->siz == 4) VPUT(R_X86_64_TPOFF32 | (uint64)elfsym<<32); else return -1; break; case R_CALL: if(r->siz == 4) { if(r->xsym->type == SDYNIMPORT) VPUT(R_X86_64_GOTPCREL | (uint64)elfsym<<32); else VPUT(R_X86_64_PC32 | (uint64)elfsym<<32); } else return -1; break; case R_PCREL: if(r->siz == 4) { VPUT(R_X86_64_PC32 | (uint64)elfsym<<32); } else return -1; break; case R_TLS: if(r->siz == 4) { if(flag_shared) VPUT(R_X86_64_GOTTPOFF | (uint64)elfsym<<32); else VPUT(R_X86_64_TPOFF32 | (uint64)elfsym<<32); } else return -1; break; } VPUT(r->xadd); return 0; }
uint32 elf64writehdr(void) { int i; for (i = 0; i < EI_NIDENT; i++) cput(hdr.ident[i]); WPUT(hdr.type); WPUT(hdr.machine); LPUT(hdr.version); VPUT(hdr.entry); VPUT(hdr.phoff); VPUT(hdr.shoff); LPUT(hdr.flags); WPUT(hdr.ehsize); WPUT(hdr.phentsize); WPUT(hdr.phnum); WPUT(hdr.shentsize); WPUT(hdr.shnum); WPUT(hdr.shstrndx); return ELF64HDRSIZE; }
static void putelfsyment(int off, vlong addr, vlong size, int info, int shndx, int other) { switch(thechar) { case '6': LPUT(off); cput(info); cput(other); WPUT(shndx); VPUT(addr); VPUT(size); symsize += ELF64SYMSIZE; break; default: LPUT(off); LPUT(addr); LPUT(size); cput(info); cput(other); WPUT(shndx); symsize += ELF32SYMSIZE; break; } }
void elf64phdr(ElfPhdr *e) { LPUT(e->type); LPUT(e->flags); VPUT(e->off); VPUT(e->vaddr); VPUT(e->paddr); VPUT(e->filesz); VPUT(e->memsz); VPUT(e->align); }
void vsip_vfreqswap_f(const vsip_vview_f *a){ vsip_length N=a->length; vsip_length n; vsip_index i; if(N > 1){ if(N & 1){ /* odd */ vsip_scalar_f t = VGET(a,N-1); n = N/2 - 1; for(i=0; i<=n; i++) swapOdd(a,n-i,N-i-2); VPUT(a,N/2,t); } else { /* even */ n=N/2; for(i=0; i<N/2; i++) swapEven(a,i,i+n); } } }
void elf64shdr(ElfShdr *e) { LPUT(e->name); LPUT(e->type); VPUT(e->flags); VPUT(e->addr); VPUT(e->off); VPUT(e->size); LPUT(e->link); LPUT(e->info); VPUT(e->addralign); VPUT(e->entsize); }
static void swapOdd(const vsip_vview_f *a, vsip_index i, vsip_index j){ vsip_scalar_f t = VGET(a,i); VPUT(a,i,VGET(a,j)); VPUT(a,j+1,t); }
static void swapEven(const vsip_vview_d *a, vsip_index i, vsip_index j){ vsip_scalar_d t = VGET(a,i); VPUT(a,i,VGET(a,j)); VPUT(a,j,t); }