diff options
Diffstat (limited to 'src/cmd/5l/asm.c')
| -rw-r--r-- | src/cmd/5l/asm.c | 57 | 
1 files changed, 31 insertions, 26 deletions
| diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c index 04f2a9c6c..a1220a38e 100644 --- a/src/cmd/5l/asm.c +++ b/src/cmd/5l/asm.c @@ -125,7 +125,7 @@ adddynrel(Sym *s, Reloc *r)  	// Handle relocations found in ELF object files.  	case 256 + R_ARM_PLT32:  		r->type = D_CALL; -		if(targ->dynimpname != nil && !targ->dynexport) { +		if(targ->type == SDYNIMPORT) {  			addpltsym(targ);  			r->sym = lookup(".plt", 0);  			r->add = braddoff(r->add, targ->plt / 4); @@ -138,7 +138,7 @@ adddynrel(Sym *s, Reloc *r)  		return;  	case 256 + R_ARM_GOT32: // R_ARM_GOT_BREL -		if(targ->dynimpname == nil || targ->dynexport) { +		if(targ->type != SDYNIMPORT) {  			addgotsyminternal(targ);  		} else {  			addgotsym(targ); @@ -149,7 +149,7 @@ adddynrel(Sym *s, Reloc *r)  		return;  	case 256 + R_ARM_GOT_PREL: // GOT(S) + A - P -		if(targ->dynimpname == nil || targ->dynexport) { +		if(targ->type != SDYNIMPORT) {  			addgotsyminternal(targ);  		} else {  			addgotsym(targ); @@ -171,7 +171,7 @@ adddynrel(Sym *s, Reloc *r)  	case 256 + R_ARM_CALL:  		r->type = D_CALL; -		if(targ->dynimpname != nil && !targ->dynexport) { +		if(targ->type == SDYNIMPORT) {  			addpltsym(targ);  			r->sym = lookup(".plt", 0);  			r->add = braddoff(r->add, targ->plt / 4); @@ -184,7 +184,7 @@ adddynrel(Sym *s, Reloc *r)  		return;  	case 256 + R_ARM_ABS32:  -		if(targ->dynimpname != nil && !targ->dynexport) +		if(targ->type == SDYNIMPORT)  			diag("unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ->name);  		r->type = D_ADDR;  		return; @@ -201,7 +201,7 @@ adddynrel(Sym *s, Reloc *r)  	case 256 + R_ARM_PC24:  	case 256 + R_ARM_JUMP24:  		r->type = D_CALL; -		if(targ->dynimpname != nil && !targ->dynexport) { +		if(targ->type == SDYNIMPORT) {  			addpltsym(targ);  			r->sym = lookup(".plt", 0);  			r->add = braddoff(r->add, targ->plt / 4); @@ -210,7 +210,7 @@ adddynrel(Sym *s, Reloc *r)  	}  	// Handle references to ELF symbols from our own object files. -	if(targ->dynimpname == nil || targ->dynexport) +	if(targ->type != SDYNIMPORT)  		return;  	switch(r->type) { @@ -240,12 +240,13 @@ adddynrel(Sym *s, Reloc *r)  }  int -elfreloc1(Reloc *r, vlong off, int32 elfsym, vlong add) +elfreloc1(Reloc *r, vlong sectoff)  { -	USED(add);	// written to obj file by ../ld/data.c's reloc - -	LPUT(off); +	int32 elfsym; +	 +	LPUT(sectoff); +	elfsym = r->xsym->elfsym;  	switch(r->type) {  	default:  		return -1; @@ -295,6 +296,16 @@ elfsetupplt(void)  }  int +machoreloc1(Reloc *r, vlong sectoff) +{ +	USED(r); +	USED(sectoff); + +	return -1; +} + + +int  archreloc(Reloc *r, Sym *s, vlong *val)  {  	switch(r->type) { @@ -324,15 +335,16 @@ archreloc(Reloc *r, Sym *s, vlong *val)  		*val = braddoff((0xff000000U & (uint32)r->add),   		                (0xffffff & (uint32)  		                   ((symaddr(r->sym) + ((uint32)r->add) * 4 - (s->value + r->off)) / 4))); -	return 0; -} -return -1; +		return 0; +	} +	return -1;  }  static Reloc *  addpltreloc(Sym *plt, Sym *got, Sym *sym, int typ)  { -Reloc *r; +	Reloc *r; +  	r = addrel(plt);  	r->sym = got;  	r->off = plt->size; @@ -437,20 +449,13 @@ adddynsym(Sym *s)  	if(s->dynid >= 0)  		return; -	if(s->dynimpname == nil) { -		s->dynimpname = s->name; -		//diag("adddynsym: no dynamic name for %s", s->name); -	} -  	if(iself) {  		s->dynid = nelfsym++;  		d = lookup(".dynsym", 0);  		/* name */ -		name = s->dynimpname; -		if(name == nil) -			name = s->name; +		name = s->extname;  		adduint32(d, addstring(lookup(".dynstr", 0), name));  		/* value */ @@ -464,7 +469,7 @@ adddynsym(Sym *s)  		/* type */  		t = STB_GLOBAL << 4; -		if(s->dynexport && (s->type&SMASK) == STEXT) +		if((s->cgoexport & CgoExportDynamic) && (s->type&SMASK) == STEXT)  			t |= STT_FUNC;  		else  			t |= STT_OBJECT; @@ -472,7 +477,7 @@ adddynsym(Sym *s)  		adduint8(d, 0);  		/* shndx */ -		if(!s->dynexport && s->dynimpname != nil) +		if(s->type == SDYNIMPORT)  			adduint16(d, SHN_UNDEF);  		else {  			switch(s->type) { @@ -600,7 +605,7 @@ asmb(void)  					Bprint(&bso, "%5.2f dwarf\n", cputime());  				dwarfemitdebugsections(); -				if(isobj) +				if(linkmode == LinkExternal)  					elfemitreloc();  			}  			break; | 
