⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtldlib.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
/* @(#)rtldlib.s 1.1 92/07/30 SMI *//* * Copyright (c) 1987 by Sun Microsystems, Inc. *//* * MC680x0-dependent code for run-time link editor. */#include "assym.h"#include <sys/syscall.h>	.text	.globl	_binder, _rtbinder/* * Stack frame and calling sequence: version #, ptr to interface structure. */#define FRAME	0xc			/* Size of stack frame */#define version	a6@(8)			/* Version # of crt0/ld.so intfce */#define ip	a6@(FRAME)		/* Pointer to interface struct *//* * Obsolete interface: kept for developmental compatibility */#define BA	(-FRAME+0x0)		/* Base address offset */#define ba	a6@(BA)#define EP	(-FRAME+0x4)		/* Environment Pointer offset */#define ep	a6@(EP)#define UDP	(-FRAME+0x8)		/* Offset to main's __DYNAMIC */#define udp	a6@(UDP)#define arg_udp a6@(0x8)#define arg_ep	a6@(0xc)_rtl:					| crt0 calls us here	link	a6,#-FRAME		| Allocate stack frame	moveml	d2-d3/a5,sp@-		| Be transparent	movl	#__GLOBAL_OFFSET_TABLE_,a5	| Get pointer to our linkage	lea	pc@(0, a5:L),a5		|  tables| If version is greater than a page size, then this is the obsolete| interface, where "version" is really a pointer to the dynamic | structure.  N.B. If we ever get more than 2047 revisions to this,| we need to do "something".  (Like get rid of the idiot who took| 2048 tries to get it right.)  Note that all table addresses are| still "relative", thus we must take pains to make them absolute.	movl	version,d0		| Interrogate version	andl	#PAGEMASK,d0		| See if bigger than page size	jne	oldversion		|  It is, old interface	movl	ip,a1			| Extract data from interface structure	movl	a1@,d2			| Base address of ld.so	movl	d2,d3			| Build arguments to rtld	addl	a5@,d3			| Determine address of rtld's	movl	d3,sp@-			|   GLOBAL_OFFSET_TABLE	movl	ip,sp@-			| Pass rest of arguments	movl	version,sp@-		| 	movl	a5@(_rtld:w),a0		| Relocate address of function	addl	d2,a0			| 	jsr	a0@			| _rtld(version, ip, GLOBAL_OFFSET_...)	addw	#0xc,sp			| Pop arguments	jra	done			|   and leave| Here if we're processing the old interface.oldversion:	lea	pc@(_rtl-(oldversion+2)),a0	addl	#-TXTOFF,a0		| Derive base address of link editor	movl	a5@,a1			| Calculate address of it's	addl	a0,a1			|   GLOBAL_OFFSET_TABLE	movl	a1,sp@-			| Pass it along	movl	arg_udp,udp		| Dummy up an	movl	arg_ep,ep		|   "interface structure"	movl	a0,ba		pea	ba	movl	arg_udp,sp@-		| Pass "version #"	movl	a5@(_rtld:w),a1		| Relocate address of function	addl	a1,a0		jsr	a0@			| _rtld(udp, &[ba, ep, udp], 	addw	#0xc,sp			|   GLOBAL_OFFSET_...)| Common exitdone:	moveml	sp@+,d2-d3/a5		| Be transparent	unlk	a6			| Delete frame,	rts				|   and return| First call to a procedure generally comes through here for| binding._rtbinder:				| jsr <unbound symbol>	link	a6,#0			| Make a frame	moveml	d0-d1/a0-a1,sp@-	| Be transparent to caller	movl	a6@(4),a0		| Get return PC	movw	a0@,d0			| Get pointer to relocation record	extl	d0			| Stretch out to full word	movl	d0,sp@-			| Stack	movl	a0,sp@-			|   along with return PC	jbsr	_binder,a0		| _binder(rpc, index)	addql	#8,sp			| Pop arguments	movl	d0,a6@(4)		| return address = _binder()#ifdef mc68020	trap	#2			| flush 68020 instruction cache#endif	moveml	sp@+,d0-d1/a0-a1	| Become transparent	unlk	a6			| Delete frame	rts				|   and get on with the call| Special system call stubs which return real and effective user and group| id's.  Saves overhead of making separate calls for each.	.globl	_getreuid, _getregid_getreuid:	pea	SYS_getuid		| getuid()	trap	#0			| Do the call, pop stack	bcss	out			| Handle error (!)	movl	sp@(4),a0		| Pick up addresses of result	movl	sp@(8),a1		|   storage	movl	d0,a0@			| Deposit the answers	movl	d1,a1@			|   for both values	rts				| Go homeout:	jbsr	cerror,a0		| Call common error routine	rts_getregid:	pea	SYS_getgid		| getgid()	trap	#0	bcss	out	movl	sp@(4),a0	movl	sp@(8),a1	movl	d0,a0@	movl	d1,a1@	rts

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -