Index: uspace/lib/c/arch/ia32/src/rtld/reloc.c
===================================================================
--- uspace/lib/c/arch/ia32/src/rtld/reloc.c	(revision 8a1fb098bbfa685e158cd315fe823dd431647b01)
+++ uspace/lib/c/arch/ia32/src/rtld/reloc.c	(revision 8539cf2690b4bac2b19facb4566919e7cb6a07dd)
@@ -69,5 +69,5 @@
 	uint32_t sym_size;
 	char *str_tab;
-	
+
 	elf_symbol_t *sym_def;
 	module_t *dest;
@@ -80,5 +80,5 @@
 
 	DPRINTF("address: 0x%x, entries: %d\n", (uintptr_t)rt, rt_entries);
-	
+
 	for (i = 0; i < rt_entries; ++i) {
 //		DPRINTF("symbol %d: ", i);
@@ -100,5 +100,5 @@
 //			DPRINTF("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset);
 			sym_def = symbol_def_find(str_tab + sym->st_name,
-			    m, &dest);
+			    m, ssf_none, &dest);
 //			DPRINTF("dest name: '%s'\n", dest->dyn.soname);
 //			DPRINTF("dest bias: 0x%x\n", dest->bias);
@@ -137,7 +137,22 @@
 			/*
 			 * Copy symbol data from shared object to specified
-			 * location.
+			 * location. Need to find the 'source', i.e. the
+			 * other instance of the object than the one in the
+			 * executable program.
 			 */
 			DPRINTF("fixup R_386_COPY (s)\n");
+
+			sym_def = symbol_def_find(str_tab + sym->st_name,
+			    m, ssf_noroot, &dest);
+
+			if (sym_def) {
+				sym_addr = (uint32_t)
+				    symbol_get_addr(sym_def, dest);
+			} else {
+				printf("Source definition of '%s' not found.\n",
+				    str_tab + sym->st_name);
+				continue;
+			}
+
 			sym_size = sym->st_size;
 			if (sym_size != sym_def->st_size) {
@@ -147,7 +162,8 @@
 					sym_size = sym_def->st_size;
 			}
+
 			memcpy(r_ptr, (const void *)sym_addr, sym_size);
 			break;
-			
+
 		case R_386_RELATIVE:
 			DPRINTF("fixup R_386_RELATIVE (b+a)\n");
