From ac1c09458c465c83af1cee17b05c51ffcb51b578 Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <iant@golang.org>
Date: Tue, 11 Jan 2011 14:43:28 -0800
Subject: [PATCH] ld: Fix exported dynamic symbols on 386 Mach-O.

R=rsc
CC=golang-dev
https://golang.org/cl/3948043
---
 src/cmd/8l/asm.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c
index e1496e3d80..cdb5a33e6f 100644
--- a/src/cmd/8l/asm.c
+++ b/src/cmd/8l/asm.c
@@ -174,7 +174,7 @@ adddynrel(Sym *s, Reloc *r)
 
 	// Handle relocations found in ELF object files.
 	case 256 + R_386_PC32:
-		if(targ->dynimpname)
+		if(targ->dynimpname != nil && !targ->dynexport)
 			diag("unexpected R_386_PC32 relocation for dynamic symbol %s", targ->name);
 		if(targ->type == 0 || targ->type == SXREF)
 			diag("unknown symbol %s in pcrel", targ->name);
@@ -185,7 +185,7 @@ adddynrel(Sym *s, Reloc *r)
 	case 256 + R_386_PLT32:
 		r->type = D_PCREL;
 		r->add += 4;
-		if(targ->dynimpname != nil) {
+		if(targ->dynimpname != nil && !targ->dynexport) {
 			addpltsym(targ);
 			r->sym = lookup(".plt", 0);
 			r->add += targ->plt;
@@ -193,7 +193,7 @@ adddynrel(Sym *s, Reloc *r)
 		return;		
 	
 	case 256 + R_386_GOT32:
-		if(targ->dynimpname == nil) {
+		if(targ->dynimpname == nil || targ->dynexport) {
 			// have symbol
 			// turn MOVL of GOT entry into LEAL of symbol itself
 			if(r->off < 2 || s->p[r->off-2] != 0x8b) {
@@ -221,19 +221,19 @@ adddynrel(Sym *s, Reloc *r)
 		return;
 
 	case 256 + R_386_32:
-		if(targ->dynimpname)
+		if(targ->dynimpname != nil && !targ->dynexport)
 			diag("unexpected R_386_32 relocation for dynamic symbol %s", targ->name);
 		r->type = D_ADDR;
 		return;
 	
 	case 512 + MACHO_GENERIC_RELOC_VANILLA*2 + 0:
 		r->type = D_ADDR;
-		if(targ->dynimpname)
+		if(targ->dynimpname != nil && !targ->dynexport)
 			diag("unexpected reloc for dynamic symbol %s", targ->name);
 		return;
 	
 	case 512 + MACHO_GENERIC_RELOC_VANILLA*2 + 1:
-		if(targ->dynimpname) {
+		if(targ->dynimpname != nil && !targ->dynexport) {
 			addpltsym(targ);
 			r->sym = lookup(".plt", 0);
 			r->add = targ->plt;
@@ -241,12 +241,10 @@ adddynrel(Sym *s, Reloc *r)
 			return;
 		}
 		r->type = D_PCREL;
-		if(targ->dynimpname)
-			diag("unexpected pc-relative reloc for dynamic symbol %s", targ->name);
 		return;
 	
 	case 512 + MACHO_FAKE_GOTPCREL:
-		if(targ->dynimpname == nil) {
+		if(targ->dynimpname == nil || targ->dynexport) {
 			// have symbol
 			// turn MOVL of GOT entry into LEAL of symbol itself
 			if(r->off < 2 || s->p[r->off-2] != 0x8b) {
@@ -265,7 +263,7 @@ adddynrel(Sym *s, Reloc *r)
 	}
 	
 	// Handle references to ELF symbols from our own object files.
-	if(targ->dynimpname == nil)
+	if(targ->dynimpname == nil || targ->dynexport)
 		return;
 
 	switch(r->type) {
-- 
2.30.9