/*
* Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
** Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
* Reserved. This file contains Original Code and/or Modifications of
* Original Code as defined in and that are subject to the Apple Public
* Source License Version 1.1 (the "License"). You may not use this file
* except in compliance with the License. Please obtain a copy of the
* License at http://www.apple.com/publicsource and read it before using
* this file.
** The Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
** @APPLE_LICENSE_HEADER_END@
*/
#if __m68k__
#ifdef CRT1
/*
* After the dynamic linker initialization is done the value at offset 0 in
* the (__DATA,__dyld) section (in this case the .long at the symbol
* dyld_lazy_symbol_binding_entry_point) is filled in. If it was not most
* likely this program was run under a kernel without support for mapping in
* and jumping to the dynamic linker at start up.
*/
.text
.align 1
.private_extern __dyld_init_check
__dyld_init_check:tstl dyld_lazy_symbol_binding_entry_point
beq 1f
rts
1:
/*
* At this point the dynamic linker initialization was not run so print a
* message on stderr and exit non-zero. Since we can't use any libraries the
* raw system call interfaces must be used.
*
* write(stderr, error_message, sizeof(error_message));
*/
movel #78,d3
movel #error_message,d2
movel #2,d1
moveq #4,d0 | write() is system call number 4
trap #4
/*
* _exit(59);
*/
movel #59,d1
moveq #1,d0 | _exit() is system call number 1
trap #4
| this call to _exit() should not fall through
.cstring
error_message:.ascii"The kernel support for the dynamic linker is not present ".ascii"to run this program.\n\0"
/*
* This is part of the code generation for the dynamic link editor's interface.
* The stub_binding_helper for m68k executables. On transfer to this point the
* address of the lazy pointer to be has been pushed on the stack. Here we push
* the address of the mach header for the image and transfer control to the lazy
* symbol binding entry point. A pointer to the lazy symbol binding entry point
* is set at launch time by the dynamic link editor. This pointer is located at
* offset 0 (zero) in the (__DATA,__dyld) section and declared here. A pointer
* to the function address of _dyld_func_lookup in the dynamic link editor is
* also set at launch time by the dynamic link editor. This pointer is located
* at offset 4 in the in the (__DATA,__dyld) section and declared here. A
* definition of the 'C' function _dyld_func_lookup() is defined here as a
* private_extern to jump through the pointer.
*/
.text
.align 1
.private_extern dyld_stub_binding_helper
dyld_stub_binding_helper:movel #__mh_execute_header,sp@-
movel dyld_lazy_symbol_binding_entry_point,a0
jmp a0@
.private_extern __dyld_func_lookup
__dyld_func_lookup:movel dyld_func_lookup_pointer,a0
jmp a0@
.dyld
.align 2
dyld_lazy_symbol_binding_entry_point:.long 0 | filled in at launch time by dynamic link editor
dyld_func_lookup_pointer:.long 0 | filled in at launch time by dynamic link editor
| the next three are used for the debugger interface
.long 0 | start_debug_thread
.long 0 | debug_port
.long 0 | debug_thread
.long dyld_stub_binding_helper
.long 0 | core debug
#else /* !defined(CRT1) */
.text
.align 1
.private_extern __dyld_func_lookup
__dyld_func_lookup:illegal
#endif /* CRT1 */
#endif /* __m68k__ */
#ifdef __i386__
#ifdef CRT1
/*
* After the dynamic linker initialization is done the value at offset 0 in
* the (__DATA,__dyld) section (in this case the .long at the symbol
* dyld_lazy_symbol_binding_entry_point) is filled in. If it was not most
* likely this program was run under a kernel without support for mapping in
* and jumping to the dynamic linker at start up.
*/
.text
.align 2,0x90
.private_extern __dyld_init_check
__dyld_init_check:cmpl $0,dyld_lazy_symbol_binding_entry_point
je 1f
ret
1:
/*
* At this point the dynamic linker initialization was not run so print a
* message on stderr and exit non-zero. Since we can't use any libraries the
* raw system call interfaces must be used.
*
* write(stderr, error_message, sizeof(error_message));
*/
pushl $78
pushl $error_message
pushl $2
push $0
movl $4,%eax # write() is system call number 4
lcall $0x2b,$0
addl $16,%esp
/*
* _exit(59);
*/
pushl $59
push $0
movl $1,%eax # _exit() is system call number 1
lcall $0x2b,$0
# this call to _exit() should not fall through
.cstring
error_message:.ascii"The kernel support for the dynamic linker is not present ".ascii"to run this program.\n\0"
/*
* This is part of the code generation for the dynamic link editor's interface.
* The stub_binding_helper for i386 executables. On transfer to this point the
* address of the lazy pointer to be has been pushed on the stack. Here we push
* the address of the mach header for the image and transfer control to the lazy
* symbol binding entry point. A pointer to the lazy symbol binding entry point
* is set at launch time by the dynamic link editor. This pointer is located at
* offset 0 (zero) in the (__DATA,__dyld) section and declared here. A pointer
* to the function address of _dyld_func_lookup in the dynamic link editor is
* also set at launch time by the dynamic link editor. This pointer is located
* at offset 4 in the in the (__DATA,__dyld) section and declared here. A
* definition of the 'C' function _dyld_func_lookup() is defined here as a
* private_extern to jump through the pointer.
*/
.text
.align 2,0x90
.private_extern dyld_stub_binding_helper
dyld_stub_binding_helper:pushl $__mh_execute_header
jmpl *dyld_lazy_symbol_binding_entry_point
.align 2,0x90
.private_extern __dyld_func_lookup
__dyld_func_lookup:jmpl *dyld_func_lookup_pointer
.dyld
.align 2
dyld_lazy_symbol_binding_entry_point:.long 0 # filled in at launch time by dynamic link editor
dyld_func_lookup_pointer:.long 0 # filled in at launch time by dynamic link editor
# the next three are used for the debugger interface
.long 0 # start_debug_thread
.long 0 # debug_port
.long 0 # debug_thread
.long dyld_stub_binding_helper
.long 0 # core debug
#else /* !defined(CRT1) */
.text
.align 2,0x90
.private_extern __dyld_func_lookup
__dyld_func_lookup:hlt
#endif /* CRT1 */
#endif /* __i386__ */
#ifdef __hppa__
#ifdef CRT1
/*
* After the dynamic linker initialization is done the value at offset 0 in
* the (__DATA,__dyld) section (in this case the .long at the symbol
* dyld_lazy_symbol_binding_entry_point) is filled in. If it was not most
* likely this program was run under a kernel without support for mapping in
* and jumping to the dynamic linker at start up.
*/
.text
.align 2
.private_extern __dyld_init_check
__dyld_init_check:ldil L`dyld_lazy_symbol_binding_entry_point,%r20
ldw R`dyld_lazy_symbol_binding_entry_point(%r20),%r20
combt,=,n %r20,%r0,1f
bv,n 0(%r2)
1:
/*
* At this point the dynamic linker initialization was not run so print a
* message on stderr and exit non-zero. Since we can't use any libraries the
* raw system call interfaces must be used.
*
* write(stderr, error_message, sizeof(error_message));
*/
ldi 2,%r26
ldil L`error_message,%r19
ldo R`error_message(%r19),%r25
ldi 78,%r24
#define SYSCALL_TRAP 0xc0000004
L1: ldil L`SYSCALL_TRAP,%r1
ble R`SYSCALL_TRAP(%sr4,%r1)
ldi 4,%r22 ; write() is system call number 4
b,n L2 ; success go on to call _exit()
b,n L1 ; signal happened retry system call
b,n L2 ; system called failed, go on to call _exit()
/*
* _exit(59);
*/
L2: ldi 59,%r26
ldil L`SYSCALL_TRAP,%r1
ble R`SYSCALL_TRAP(%sr4,%r1)
ldi 1,%r22 ; _exit() is system call number 1
break 0,0 ; success, this call to _exit() should not return
b,n L2 ; signal happened retry system call
break 0,0 ; system called failed
.cstring
error_message:.ascii"The kernel support for the dynamic linker is not present ".ascii"to run this program.\n\0"
/*
* This is part of the code generation for the dynamic link editor's interface.
* The stub_binding_helper for hppa executables. On transfer to this point the
* address of the lazy pointer to be bound is in r21. The return address on
* call to the stub is still in r2 or (r31 or a millicode call). Here we place
* the address of the mach header for the image in r22 and transfer control to
* the lazy symbol binding entry point. A pointer to the lazy symbol binding
* entry point is set at launch time by the dynamic link editor. This pointer
* is located at offset 0 (zero) in the (__DATA,__dyld) section and declared
* here. A pointer to the function address of _dyld_func_lookup in the dynamic
* link editor is also set at launch time by the dynamic link editor. This
* pointer is located at offset 4 in the in the (__DATA,__dyld) section and
* declared here. A definition of the 'C' function _dyld_func_lookup() is
* defined here as a private_extern to jump through the pointer.
*/
.text
.align 2
.private_extern dyld_stub_binding_helper
dyld_stub_binding_helper:ldil L`__mh_execute_header,%r22
ldo R`__mh_execute_header(%r22),%r22
ldil L`dyld_lazy_symbol_binding_entry_point,%r1
ldw R`dyld_lazy_symbol_binding_entry_point(%r1),%r1
be,n 0(4,%r1)
.text
.align 2
.private_extern __dyld_func_lookup
__dyld_func_lookup:ldil L`dyld_func_lookup_pointer,%r1
ldw R`dyld_func_lookup_pointer(%r1),%r1
be,n 0(4,%r1)
.dyld
.align 2
dyld_lazy_symbol_binding_entry_point:.long 0 ; filled in at launch time by dynamic link editor
dyld_func_lookup_pointer:
.long 0 ; filled in at launch time by dynamic link editor
; the next three are used for the debugger interface
.long 0 ; start_debug_thread
.long 0 ; debug_port
.long 0 ; debug_thread
.long dyld_stub_binding_helper
.long 0 ; core debug
#else /* !defined(CRT1) */
.text
.align 2
.private_extern __dyld_func_lookup
__dyld_func_lookup:break 0,0
#endif /* CRT1 */
#endif /* __hppa__ */
#ifdef __sparc__
#ifdef CRT1
/*
* After the dynamic linker initialization is done the value at offset 0 in
* the (__DATA,__dyld) section (in this case the .long at the symbol
* dyld_lazy_symbol_binding_entry_point) is filled in. If it was not, most
* likely this program was run under a kernel without support for mapping in
* and jumping to the dynamic linker at start up.
*/
.text
.align 2
.private_extern __dyld_init_check
__dyld_init_check:sethi %hi(dyld_lazy_symbol_binding_entry_point),%o0
ld [%o0+%lo(dyld_lazy_symbol_binding_entry_point)],%o1
tst %o1
bz,a 1f
mov 2,%o0 ! stderr for write() below
retl
nop
1:
/*
* At this point the dynamic linker initialization was not run so print a
* message on stderr and exit non-zero. Since we can't use any libraries the
* raw system call interfaces must be used.
*
* write(stderr, error_message, sizeof(error_message));
*
* write() is syscall #4
*/
.text
.align 2
dyld_init_error:set error_message,%o1 ! error msg ptr
set (78),%o2 ! error msg len
mov 4,%g1 ! write()
ta 0x80 ! SYSCALL trap
retl
nop
mov 1,%g1 ! exit()
ta 0x80 ! SYSCALL trap
ta 0x81 ! debugger - we should never get here
.cstring
error_message:.ascii"The kernel support for the dynamic linker is not present ".ascii"to run this program.\n\0"
/*
* This is part of the code generation for the dynamic link editor's interface.
* The stub_binding_helper for sparc executables. On transfer to this point the
* address of the lazy pointer to be bound is in %g5. Here we place
* the address of the mach header for the image in %g6 and transfer control to
* the lazy symbol binding entry point. A pointer to the lazy symbol binding
* entry point is set at launch time by the dynamic link editor. This pointer
* is located at offset 0 (zero) in the (__DATA,__dyld) section and declared
* here. A pointer to the function address of _dyld_func_lookup in the dynamic
* link editor is also set at launch time by the dynamic link editor. This
* pointer is located at offset 4 in the in the (__DATA,__dyld) section and
* declared here. A definition of the 'C' function _dyld_func_lookup() is
* defined here as a private_extern to jump through the pointer.
*/
.text
.align 2
.private_extern dyld_stub_binding_helper
dyld_stub_binding_helper:set __mh_execute_header,%g6
! we use %o7 as a scratch register as the stub has already saved the
! original caller return register and thrashed %o7
sethi %hi(dyld_lazy_symbol_binding_entry_point),%o7
ld [%o7+%lo(dyld_lazy_symbol_binding_entry_point)],%o7
jmp %o7
nop
.text
.align 2
.private_extern __dyld_func_lookup
__dyld_func_lookup:sethi %hi(dyld_func_lookup_pointer),%g3
ld [%g3+%lo(dyld_func_lookup_pointer)],%g3
jmp %g3
nop
.dyld
.align 2
dyld_lazy_symbol_binding_entry_point:.long 0 ! filled in at launch time by dynamic link editor
dyld_func_lookup_pointer:.long 0 ! filled in at launch time by dynamic link editor
! the next three are used for the debugger interface
.long 0 ! start_debug_thread
.long 0 ! debug_port
.long 0 ! debug_thread
.long dyld_stub_binding_helper
.long 0 ! core debug
#else /* !defined(CRT1) */
.text
.align 2
.private_extern __dyld_func_lookup
__dyld_func_lookup:ta 9
#endif /* CRT1 */
#endif /* __sparc__ */
#ifdef __ppc__
#ifdef CRT1
/*
* After the dynamic linker initialization is done the value at offset 0 in
* the (__DATA,__dyld) section (in this case the .long at the symbol
* dyld_lazy_symbol_binding_entry_point) is filled in. If it was not most
* likely this program was run under a kernel without support for mapping in
* and jumping to the dynamic linker at start up.
*/
.text
.align 2
.private_extern __dyld_init_check
__dyld_init_check:lis r11,ha16(dyld_lazy_symbol_binding_entry_point)
lwz r11,lo16(dyld_lazy_symbol_binding_entry_point)(r11)
cmpwi cr1,r11,0
beq- cr1,1f
blr
1:
/*
* At this point the dynamic linker initialization was not run so print a
* message on stderr and exit non-zero. Since we can't use any libraries the
* raw system call interfaces must be used.
*
* write(stderr, error_message, sizeof(error_message));
*/
li r5,lo16(78)
li r4,hi16(error_message)
ori r4,r4,lo16(error_message)
li r3,2
li r0,4 ; write() is system call number 4
sc
/*
* _exit(59);
*/
li r3,59
li r0,1 ; exit() is system call number 1
sc
trap; this call to _exit() should not fall through
.cstring
error_message:.ascii"The kernel support for the dynamic linker is not present ".ascii"to run this program.\n\0"
/*
* This is part of the code generation for the dynamic link editor's interface.
* The stub_binding_helper for ppc executables. On transfer to this point the
* address of the lazy pointer to be bound is in r11. The return address on
* call to the stub is still in lr. Here we place the address of the mach
* header for the image in r12 and transfer control to the lazy symbol binding
* entry point. A pointer to the lazy symbol binding entry point is set at
* launch time by the dynamic link editor. This pointer is located at offset 0
* (zero) in the (__DATA,__dyld) section and declared here. A pointer to
* the function address of _dyld_func_lookup in the dynamic link editor is also
* set at launch time by the dynamic link editor. This pointer is located at
* offset 4 in the in the (__DATA,__dyld) section and declared here. A
* definition of the 'C' function _dyld_func_lookup() is defined here as a
* private_extern to jump through the pointer.
*/
.text
.align 2
.private_extern dyld_stub_binding_helper
dyld_stub_binding_helper:lis r12,ha16(dyld_lazy_symbol_binding_entry_point)
lwz r0,lo16(dyld_lazy_symbol_binding_entry_point)(r12)
mtctr r0
lis r12,hi16(__mh_execute_header)
ori r12,r12,lo16(__mh_execute_header)
bctr
.align 2
.private_extern __dyld_func_lookup
__dyld_func_lookup:lis r11,ha16(dyld_func_lookup_pointer)
lwz r11,lo16(dyld_func_lookup_pointer)(r11)
mtctr r11
bctr
.dyld
.align 2
dyld_lazy_symbol_binding_entry_point:.long 0 ; filled in at launch time by dynamic link editor
dyld_func_lookup_pointer:
.long 0 ; filled in at launch time by dynamic link editor
; the next three are used for the debugger interface
.long 0 ; start_debug_thread
.long 0 ; debug_port
.long 0 ; debug_thread
.long dyld_stub_binding_helper
.long 0 ; core debug
#else /* !defined(CRT1) */
.text
.align 2
.private_extern __dyld_func_lookup
__dyld_func_lookup:trap
#endif /* CRT1 */
#endif /* __ppc__ */