Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 May 2009 18:13:12 GMT
From:      Arnar Mar Sig <antab@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 162958 for review
Message-ID:  <200905281813.n4SIDChX079653@repoman.freebsd.org>

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

Change 162958 by antab@antab_farm on 2009/05/28 18:12:20

	Try to get dynamic linked executables to work, however binutils is broken and does not generate working shared exectuables and libraries. All RELA entries and GOT are zeroed.

Affected files ...

.. //depot/projects/avr32/src/lib/csu/avr32/crt1.c#5 edit
.. //depot/projects/avr32/src/libexec/rtld-elf/avr32/rtld_start.S#2 edit
.. //depot/projects/avr32/src/sys/avr32/avr32/elf_machdep.c#4 edit
.. //depot/projects/avr32/src/sys/avr32/avr32/pm_machdep.c#10 edit
.. //depot/projects/avr32/src/sys/avr32/avr32/switch.S#14 edit
.. //depot/projects/avr32/src/sys/avr32/include/signal.h#5 edit
.. //depot/projects/avr32/src/usr.bin/elfdump/elfdump.c#2 edit

Differences ...

==== //depot/projects/avr32/src/lib/csu/avr32/crt1.c#5 (text+ko) ====

@@ -56,7 +56,7 @@
 extern void _fini(void);
 extern void _init(void);
 extern int main(int, char **, char **);
-extern void _start(char **ap, struct ps_strings *, fptr cleanup);
+extern void _start(char **ap, struct ps_strings *, fptr cleanup) __attribute__((naked));
 
 #ifdef GCRT
 extern void _mcleanup(void);
@@ -77,6 +77,14 @@
 	char **env;
 	const char *s;
 
+	/*
+	 * _start has no prolog and the first 2 arguments ar passed in r6-r5
+	 */
+	__asm __volatile(
+		"mov	r12, r6\n"
+		"mov	r11, r5\n"
+	);
+
 	argc = *(long *)(void *)ap;
 	argv = ap + 1;
 	env = ap + 2 + argc;

==== //depot/projects/avr32/src/libexec/rtld-elf/avr32/rtld_start.S#2 (text+ko) ====

@@ -27,11 +27,39 @@
 #include <machine/asm.h>
 __FBSDID("$FreeBSD:  $");
 
-	.text
-	.align	0
-	.globl	.rtld_start
-	.type	.rtld_start,%function
+.text
+.extern _GLOBAL_OFFSET_TABLE_
+.extern _DYNAMIC
+
+/*
+ * r5	stack
+ * r4	ps_strings
+ */
 ENTRY(.rtld_start)
+	lddpc	r12, 1f
+	lddpc	r11, 2f
+	rjmp	3f
+1:	.word	_DYNAMIC - (. + 8)
+2:	.word	_GLOBAL_OFFSET_TABLE_ - (. + 8)
+3:	add	r12, pc
+	nop
+	add	r11, pc
+	rcall	_C_LABEL(_rtld_relocate_nonplt_self)
+
+	breakpoint
+	mov	r12, r6			/* Stack is first argument */
+	sub	r11, sp, 4		/* &exit_proc (cleanup) */
+	sub	r10, sp, 8		/* &objp */
+	sub	sp, 8			/* Make room for arguments */
+	rcall	_C_LABEL(_rtld)		/* _rtld(sp, &exit_proc, &objp) */
+	breakpoint
+
+	/*
+	 * Load cleanup argument and jump to entry, first 2 arguments
+	 * to _start() are stored in r7-r6
+	 */
+	ldm	sp++, r10,pc		/* Load cleanup argument and jump to entry */
+
 	breakpoint
 END(.rtld_start)
 

==== //depot/projects/avr32/src/sys/avr32/avr32/elf_machdep.c#4 (text+ko) ====

@@ -85,7 +85,11 @@
 	.emul_path	= NULL,
 	.interp_path	= "/libexec/ld-elf.so.1",
 	.sysvec		= &elf32_freebsd_sysvec,
-	.interp_newpath	= NULL,
+	/*
+	 * toolchain sets PT_INTERP to "--relax", and i have no idea why,
+	 * this will force the right loader
+	 */
+	.interp_newpath	= "/libexec/ld-elf.so.1",
 	.brand_note	= &elf32_freebsd_brandnote,
 	.flags		= BI_CAN_EXEC_DYN | BI_BRAND_NOTE
 };

==== //depot/projects/avr32/src/sys/avr32/avr32/pm_machdep.c#10 (text+ko) ====

@@ -81,9 +81,8 @@
 {
 	/* Clear frame and set init register values, SP must be word aligned */
 	bzero((char *)td->td_frame, sizeof(struct trapframe));
-	td->td_frame->regs.r10 = 0;
-	td->td_frame->regs.r11 = ps_strings;
-	td->td_frame->regs.r12 = stack;
+	td->td_frame->regs.r5 = ps_strings;
+	td->td_frame->regs.r6 = stack;
 	td->td_frame->regs.sp = ((register_t)stack) & ~(sizeof(register_t) - 1);
 	td->td_frame->regs.pc = entry;
 

==== //depot/projects/avr32/src/sys/avr32/avr32/switch.S#14 (text+ko) ====


==== //depot/projects/avr32/src/sys/avr32/include/signal.h#5 (text+ko) ====

@@ -41,6 +41,7 @@
 
 #if __BSD_VISIBLE
 
+#include <sys/types.h>
 #include <machine/reg.h>
 
 struct sigcontext {

==== //depot/projects/avr32/src/usr.bin/elfdump/elfdump.c#2 (text+ko) ====

@@ -233,6 +233,7 @@
 	case 0x6ffffff0: return "DT_GNU_VERSYM";
 	/* 0x70000000 - 0x7fffffff processor-specific semantics */
 	case 0x70000000: return "DT_IA_64_PLT_RESERVE";
+	case 0x70000001: return "DT_AVR32_GOTSZ";
 	case 0x7ffffffd: return "DT_SUNW_AUXILIARY";
 	case 0x7ffffffe: return "DT_SUNW_USED";
 	case 0x7fffffff: return "DT_SUNW_FILTER";
@@ -257,6 +258,7 @@
 	case EM_PPC:	return "EM_PPC";
 	case EM_ARM:	return "EM_ARM";
 	case EM_ALPHA:	return "EM_ALPHA (legacy)";
+	case EM_AVR32:	return "EM_AVR32";
 	case EM_SPARCV9:return "EM_SPARCV9";
 	case EM_IA_64:	return "EM_IA_64";
 	case EM_X86_64:	return "EM_X86_64";
@@ -772,6 +774,7 @@
 		case DT_RELSZ:
 		case DT_RELENT:
 		case DT_PLTREL:
+		case DT_AVR32_GOTSZ:
 			fprintf(out, "\td_val: %jd\n", (intmax_t)val);
 			break;
 		case DT_PLTGOT:



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