Hi,

I'm currently having trouble getting uClibc 0.9.30.1 to work on m68k/m5485
processor. It gets stuck when trying to load the first shared library,
libgcc_s.so.
In my attempt to debug the problem I added only _dl_dprintf calls.
All the debug lines are prefixed by filename and line.

I tried to watch the trace of any parameter used in any _dl_mmap call.
I identified these parameters as being(sorry for the long list):
    minvma, maxvma, libaddr, status, piclibc, mmap protection flags,
        tryaddr, piclib2map, ppnt->p_vaddr, dynamic_addr, lib_loadaddr.

The first mapping is done here[ldso/ldso/dl-elf.c:468
libaddr=status'0x80016000']
requesting 0xe000 bytes. The second mapping is tried
here[ldso/ldso/dl-elf.c:586 status'0xffffffff']
but fails. The reason why I *think* it fails is overlapping memory areas.
Here, ldso/ldso/dl-elf.c:563 tryaddr'0x80023000' the address where a mapping
is needed is 0x80023000, but if you add 0x80016000(the first mapping) with
0xE000 you get 0x80024000, which overlaps over the second solicited
address(0x80023000).

Is this the intended behaviour?

Attached you will find the debug.log and the patch for ldso/ldso/dl-elf.c

Many thanks.


-- 
Regards, Groleo!

Attachment: debug.log1
Description: Binary data

--- dl-elf.c.orig	2008-11-18 16:01:35.000000000 +0200
+++ dl-elf.c	2009-03-19 17:27:52.825768564 +0200
@@ -429,12 +429,15 @@
 			if (i == 0 && ppnt->p_vaddr > 0x1000000) {
 				piclib = 0;
 				minvma = ppnt->p_vaddr;
+				_dl_dprintf(2, "%s:%i minvma'%x'\n",__FILE__,__LINE__, minvma);
 			}
 			if (piclib && ppnt->p_vaddr < minvma) {
 				minvma = ppnt->p_vaddr;
+				_dl_dprintf(2, "%s:%i minvma'%x'\n",__FILE__,__LINE__, minvma);
 			}
 			if (((unsigned long) ppnt->p_vaddr + ppnt->p_memsz) > maxvma) {
 				maxvma = ppnt->p_vaddr + ppnt->p_memsz;
+				_dl_dprintf(2, "%s:%i maxvma'%x'\n",__FILE__,__LINE__, maxvma);
 			}
 		}
 		ppnt++;
@@ -442,8 +445,10 @@
 
 	DL_CHECK_LIB_TYPE (epnt, piclib, _dl_progname, libname);
 
+	_dl_dprintf(2,"%s:%i maxvma'%x' minvma'%x' ADDR_ALIGN'%x'\n", __FILE__, __LINE__, maxvma, minvma, ADDR_ALIGN);
 	maxvma = (maxvma + ADDR_ALIGN) & ~ADDR_ALIGN;
 	minvma = minvma & ~0xffffU;
+	_dl_dprintf(2,"%s:%i maxvma'%x' minvma'%x' ADDR_ALIGN'%x'\n", __FILE__, __LINE__, maxvma, minvma, ADDR_ALIGN);
 
 	flags = MAP_PRIVATE /*| MAP_DENYWRITE */ ;
 	if (!piclib)
@@ -460,15 +465,28 @@
 			return NULL;
 		}
 		libaddr = (unsigned long) status;
+		_dl_dprintf(2, "%s:%i libaddr=status'%x' =_dl_mmap((piclib'%x' ? 0 : minvma'%x')'%x', (maxvma'%x' - minvma)'%x', PROT_NONE'%x', flags'%x' | MAP_ANONYMOUS, -1,0 )\n", __FILE__,__LINE__
+			, libaddr
+			, piclib
+			, minvma
+			, (piclib ? 0 : minvma)
+			, maxvma
+			, maxvma - minvma
+			, PROT_NONE
+			, flags
+			);
 		flags |= MAP_FIXED;
 	}
 
 	/* Get the memory to store the library */
 	ppnt = (ElfW(Phdr) *)(intptr_t) & header[epnt->e_phoff];
 
+	_dl_dprintf(2, "%s:%i libaddr'%x' before DL_INIT_LOADADDR\n", __FILE__, __LINE__, libaddr);
 	DL_INIT_LOADADDR(lib_loadaddr, libaddr, ppnt, epnt->e_phnum);
+	_dl_dprintf(2, "%s:%i libaddr'%x' after DL_INIT_LOADADDR\n", __FILE__,__LINE__,libaddr);
 
 	for (i = 0; i < epnt->e_phnum; i++) {
+		_dl_dprintf(2, "%s:%i: Loop %i\n", __FILE__, __LINE__, i);
 		if (DL_IS_SPECIAL_SEGMENT (epnt, ppnt)) {
 			char *addr;
 
@@ -542,6 +560,17 @@
 
 				size = (ppnt->p_vaddr & ADDR_ALIGN)
 				  + ppnt->p_filesz;
+				_dl_dprintf(2, "%s:%i tryaddr'%x'= piclib'%x'== 2 ? piclib2map'%x': ((char*) (piclib ? libaddr'%x': 0) + (ppnt->p_vaddr'%x' & PAGE_ALIGN'%x')'%x' '%x')\n" , __FILE__ , __LINE__
+					, tryaddr
+					,piclib
+					,piclib2map
+					,libaddr
+					,ppnt->p_vaddr
+					, PAGE_ALIGN
+					, (ppnt->p_vaddr & PAGE_ALIGN)
+					, ((ppnt->p_vaddr + ADDR_ALIGN) & ~ADDR_ALIGN)
+				);
+
 
 				/* For !MMU, mmap to fixed address will fail.
 				   So instead of desperately call mmap and fail,
@@ -550,10 +579,22 @@
 #ifndef __ARCH_USE_MMU__
 				if (piclib2map == 0)
 #endif
-				  status = (char *) _dl_mmap
+				  {status = (char *) _dl_mmap
 				    (tryaddr, size, LXFLAGS(ppnt->p_flags),
 				     flags | (piclib2map ? MAP_FIXED : 0),
 				     infile, ppnt->p_offset & OFFS_ALIGN);
+				  _dl_dprintf(2, "status'%x' =_dl_mmap(tryaddr'%x', size'%i', LXFLAGS(ppnt->p_flags'%x')'%x' flags'%x'|(piclib2map ? MAP_FIXED : 0)'%x', p_filesz'%i' p_offset'%x'\n"
+						,status
+						,tryaddr
+						,size
+						,ppnt->p_flags
+						,LXFLAGS(ppnt->p_flags)
+						,flags
+						,flags|(piclib2map ? MAP_FIXED : 0)
+						,ppnt->p_filesz
+						,ppnt->p_offset&OFFS_ALIGN
+						);
+				  }
 #ifndef __ARCH_USE_MMU__
 				else
 				  status = MAP_FAILED;
@@ -657,10 +698,12 @@
 	}
 	_dl_close(infile);
 
+	_dl_dprintf(2, "%s:%i: all done: lib_loadaddr'%x' dynamic_addr'%x'\n", __FILE__, __LINE__, lib_loadaddr,dynamic_addr);
 	/* For a non-PIC library, the addresses are all absolute */
 	if (piclib) {
 		dynamic_addr = (unsigned long) DL_RELOC_ADDR(lib_loadaddr, dynamic_addr);
 	}
+	_dl_dprintf(2, "%s:%i: all done: lib_loadaddr'%x' dynamic_addr'%x'\n", __FILE__, __LINE__, lib_loadaddr,dynamic_addr);
 
 	/*
 	 * OK, the ELF library is now loaded into VM in the correct locations
@@ -740,6 +783,7 @@
 	 */
 
 	lpnt = (unsigned long *) dynamic_info[DT_PLTGOT];
+	_dl_dprintf(2, "%s:%i: Never reached\n", __FILE__, __LINE__);
 
 	if (lpnt) {
 		lpnt = (unsigned long *) (dynamic_info[DT_PLTGOT]);
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to