Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Apr 2004 17:10:45 -0800 (PST)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 50152 for review
Message-ID:  <200404020110.i321AjX1006836@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=50152

Change 50152 by peter@peter_hammer on 2004/04/01 17:10:10

	more debug-by-printf

Affected files ...

.. //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#14 edit
.. //depot/projects/hammer/sys/kern/link_elf_obj.c#15 edit

Differences ...

==== //depot/projects/hammer/sys/amd64/amd64/elf_machdep.c#14 (text+ko) ====

@@ -108,12 +108,14 @@
 {
 	Elf_Addr relocbase = (Elf_Addr) lf->address;
 	Elf_Addr *where;
+	int32_t *where32;
 	Elf_Addr addr;
 	Elf_Addr addend;
 	Elf_Word rtype, symidx;
 	const Elf_Rel *rel;
 	const Elf_Rela *rela;
 
+printf("elf_reloc_internal: data %p, local %d\n", data, local);
 	switch (type) {
 	case ELF_RELOC_REL:
 		rel = (const Elf_Rel *)data;
@@ -121,6 +123,7 @@
 		addend = *where;
 		rtype = ELF_R_TYPE(rel->r_info);
 		symidx = ELF_R_SYM(rel->r_info);
+printf("rel %p\n", rel);
 		break;
 	case ELF_RELOC_RELA:
 		rela = (const Elf_Rela *)data;
@@ -128,16 +131,20 @@
 		addend = rela->r_addend;
 		rtype = ELF_R_TYPE(rela->r_info);
 		symidx = ELF_R_SYM(rela->r_info);
+printf("rela %p\n", rela);
 		break;
 	default:
 		panic("unknown reloc type %d\n", type);
 	}
+printf("where %p, addend 0x%lx, rtype %ld, symindx %ld\n", where, addend, rtype, symidx);
 
 	if (local) {
 		if (rtype == R_X86_64_RELATIVE) {	/* A + B */
 			addr = relocbase + addend;
+printf("R_X86_64_RELATIVE: addr 0x%lx\n", addr);
 			if (*where != addr)
 				*where = addr;
+printf("*where = 0x%lx\n", *where);
 		}
 		return (0);
 	}
@@ -145,25 +152,31 @@
 	switch (rtype) {
 
 		case R_X86_64_NONE:	/* none */
+printf("R_X86_64_NONE\n");
 			break;
 
 		case R_X86_64_64:		/* S + A */
 			addr = elf_lookup(lf, symidx, 1);
+printf("R_X86_64_64: addr 0x%lx, addend 0x%lx\n", addr, addend);
 			if (addr == 0)
 				return -1;
 			addr += addend;
 			if (*where != addr)
 				*where = addr;
+printf("*where = 0x%lx\n", *where);
 			break;
 
 		case R_X86_64_PC32:	/* S + A - P */
 			addr = elf_lookup(lf, symidx, 1);
+printf("R_X86_64_PC32: addr 0x%lx, addend 0x%lx\n", addr, addend);
 			if (addr == 0)
 				return -1;
 			addr += addend - (Elf_Addr)where;
 			/* XXX needs to be 32 bit *where, not 64 bit */
-			if (*where != addr)
-				*where = addr;
+			where32 = (int32_t *)where;
+			if (*where32 != addr)
+				*where32 = addr;
+printf("*where32 = 0x%x\n", *where32);
 			break;
 
 		case R_X86_64_COPY:	/* none */
@@ -177,10 +190,12 @@
 
 		case R_X86_64_GLOB_DAT:	/* S */
 			addr = elf_lookup(lf, symidx, 1);
+printf("R_X86_64_GLOB_DAT: addr 0x%lx\n", addr);
 			if (addr == 0)
 				return -1;
 			if (*where != addr)
 				*where = addr;
+printf("*where = 0x%lx\n", *where);
 			break;
 
 		case R_X86_64_RELATIVE:	/* B + A */

==== //depot/projects/hammer/sys/kern/link_elf_obj.c#15 (text+ko) ====

@@ -72,14 +72,12 @@
 	
 typedef struct {
 	Elf_Rel		*rel;
-	int		relsize;
 	Elf_Off		fileoff;
 	Elf_Off		filesz;
 } Elf_relent;
 
 typedef struct {
 	Elf_Rela	*rela;
-	int		relasize;
 	Elf_Off		fileoff;
 	Elf_Off		filesz;
 } Elf_relaent;
@@ -508,8 +506,8 @@
 	 * Read in relocation tables.  Platforms use rel or rela, but
 	 * usually not both.
 	 */
-printf("reading rel\n");
 	for (i = 0; i < ef->nrel; i++) {
+printf("reading rel segment %d\n", i);
 		error = vn_rdwr(UIO_READ, nd.ni_vp,
 		    (void *)ef->reltab[i].rel,
 		    ef->reltab[i].filesz,
@@ -519,8 +517,8 @@
 		if (error)
 			goto out;
 	}
-printf("reading rela\n");
 	for (i = 0; i < ef->nrela; i++) {
+printf("reading rela segment %d\n", i);
 		error = vn_rdwr(UIO_READ, nd.ni_vp,
 		    (void *)ef->relatab[i].rela,
 		    ef->relatab[i].filesz,
@@ -618,9 +616,12 @@
 	/* Perform relocations without addend if there are any: */
 	for (i = 0; i < ef->nrel; i++) {
 		rel = ef->reltab[i].rel;
+printf("doing rel relocation block %d: %p, size %ld\n", i, rel, ef->reltab[i].filesz);
 		if (rel) {
-			rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize);
+			rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz);
+printf("rellim is %p\n", rellim);
 			while (rel < rellim) {
+printf("rel doing: %p\n", rel);
 				if (elf_reloc(&ef->lf, rel, ELF_RELOC_REL)) {
 					symname = symbol_name(ef, rel->r_info);
 					printf("link_elf: symbol %s undefined\n", symname);
@@ -634,9 +635,12 @@
 	/* Perform relocations with addend if there are any: */
 	for (i = 0; i < ef->nrela; i++) {
 		rela = ef->relatab[i].rela;
+printf("doing rela relocation block %d, %p, size %ld\n", i, rela, ef->relatab[i].filesz);
 		if (rela) {
-			relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize);
+			relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz);
+printf("relalim is %p\n", relalim);
 			while (rela < relalim) {
+printf("rela doing: %p\n", rela);
 				if (elf_reloc(&ef->lf, rela, ELF_RELOC_RELA)) {
 					symname = symbol_name(ef, rela->r_info);
 					printf("link_elf: symbol %s undefined\n", symname);
@@ -647,6 +651,7 @@
 		}
 	}
 
+printf("relocate_file done\n");
 	return 0;
 }
 
@@ -740,6 +745,8 @@
 	void **start, **stop;
 	int len, error = 0, count;
 
+printf("lookup_set: name %s\n", name);
+
 	len = strlen(name) + sizeof("__start_set_"); /* sizeof includes \0 */
 	setsym = malloc(len, M_LINKER, M_WAITOK);
 	if (setsym == NULL)
@@ -748,9 +755,11 @@
 	/* get address of first entry */
 	snprintf(setsym, len, "%s%s", "__start_set_", name);
 	error = link_elf_lookup_symbol(lf, setsym, &sym);
+printf("symbol %s result %d\n", setsym, error);
 	if (error)
 		goto out;
 	link_elf_symbol_values(lf, sym, &symval);
+printf("value %p\n", symval.value);
 	if (symval.value == 0) {
 		error = ESRCH;
 		goto out;
@@ -760,9 +769,11 @@
 	/* get address of last entry */
 	snprintf(setsym, len, "%s%s", "__stop_set_", name);
 	error = link_elf_lookup_symbol(lf, setsym, &sym);
+printf("symbol %s result %d\n", setsym, error);
 	if (error)
 		goto out;
 	link_elf_symbol_values(lf, sym, &symval);
+printf("value %p\n", symval.value);
 	if (symval.value == 0) {
 		error = ESRCH;
 		goto out;
@@ -780,6 +791,7 @@
 	if (countp)
 		*countp = count;
 
+printf("lookup_set: success\n");
  out:
 	free(setsym, M_LINKER);
 	return error;
@@ -891,9 +903,12 @@
 	/* Perform relocations without addend if there are any: */
 	for (i = 0; i < ef->nrel; i++) {
 		rel = ef->reltab[i].rel;
+printf("doing rel relocation block %d: %p, size %ld\n", i, rel, ef->relatab[i].filesz);
 		if (rel) {
-			rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].relsize);
+			rellim = (const Elf_Rel *)((const char *)rel + ef->reltab[i].filesz);
+printf("rellim is %p\n", rellim);
 			while (rel < rellim) {
+printf("rel doing: %p\n", rel);
 				elf_reloc_local(lf, rel, ELF_RELOC_REL);
 				rel++;
 			}
@@ -903,9 +918,12 @@
 	/* Perform relocations with addend if there are any: */
 	for (i = 0; i < ef->nrela; i++) {
 		rela = ef->relatab[i].rela;
+printf("doing rela relocation block %d: %p, size %ld\n", i, rela, ef->relatab[i].filesz);
 		if (rela) {
-			relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].relasize);
+			relalim = (const Elf_Rela *)((const char *)rela + ef->relatab[i].filesz);
+printf("relalim is %p\n", relalim);
 			while (rela < relalim) {
+printf("rela doing: %p\n", rela);
 				elf_reloc_local(lf, rela, ELF_RELOC_RELA);
 				rela++;
 			}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404020110.i321AjX1006836>