DragonFly BSD
DragonFly users List (threaded) for 2005-05
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Fix for "Unsupported relocation type" ?


From: "Nathaniel W. Filardo" <nwf@xxxxxxxxxxxxxx>
Date: Thu, 5 May 2005 13:33:48 -0400 (EDT)

Unsure of the proper place to send this, I'll post it here and see what happens.

There have been a few reports of "Unsupported relocation type" with type R_386_TLS_TPOFF32. This patch fixes the problem locally enough to let lang/ruby18 (with errno definitions removed) build successfully where it could not before. If this was already in the works, sorry for stepping on toes.

--nwf;
--- ./libexec/rtld-elf/i386/reloc.c.orig-nwf	2005-05-05 12:26:45.000000000 -0400
+++ ./libexec/rtld-elf/i386/reloc.c	2005-05-05 12:27:38.000000000 -0400
@@ -236,6 +236,36 @@
 		}
 		break;
 
+	    case R_386_TLS_TPOFF32:
+		{
+		    const Elf_Sym *def;
+		    const Obj_Entry *defobj;
+
+		    def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj,
+		      false, cache);
+		    if (def == NULL)
+			goto done;
+
+		    /*
+		     * We lazily allocate offsets for static TLS as we
+		     * see the first relocation that references the
+		     * TLS block. This allows us to support (small
+		     * amounts of) static TLS in dynamically loaded
+		     * modules. If we run out of space, we generate an
+		     * error.
+		     */
+		    if (!defobj->tls_done) {
+			if (!allocate_tls_offset((Obj_Entry*) defobj)) {
+			    _rtld_error("%s: No space available for static "
+					"Thread Local Storage", obj->path);
+			    goto done;
+			}
+		    }
+
+		    *where += (Elf_Addr) (defobj->tlsoffset - def->st_value);
+		}
+		break;
+
 	    case R_386_TLS_DTPMOD32:
 		{
 		    const Elf_Sym *def;


[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]