Merge pull request #105 from joshtriplett/win32-relocations
[3.1 blocker] win32.S needs to handle relocations/GOT
This commit is contained in:
196
src/x86/win32.S
196
src/x86/win32.S
@@ -548,31 +548,32 @@ USCORE_SYMBOL(ffi_call_win32):
|
|||||||
call 1f
|
call 1f
|
||||||
# Do not insert anything here between the call and the jump table.
|
# Do not insert anything here between the call and the jump table.
|
||||||
.Lstore_table:
|
.Lstore_table:
|
||||||
.long .Lnoretval /* FFI_TYPE_VOID */
|
.long .Lnoretval-.Lstore_table /* FFI_TYPE_VOID */
|
||||||
.long .Lretint /* FFI_TYPE_INT */
|
.long .Lretint-.Lstore_table /* FFI_TYPE_INT */
|
||||||
.long .Lretfloat /* FFI_TYPE_FLOAT */
|
.long .Lretfloat-.Lstore_table /* FFI_TYPE_FLOAT */
|
||||||
.long .Lretdouble /* FFI_TYPE_DOUBLE */
|
.long .Lretdouble-.Lstore_table /* FFI_TYPE_DOUBLE */
|
||||||
.long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */
|
.long .Lretlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */
|
||||||
.long .Lretuint8 /* FFI_TYPE_UINT8 */
|
.long .Lretuint8-.Lstore_table /* FFI_TYPE_UINT8 */
|
||||||
.long .Lretsint8 /* FFI_TYPE_SINT8 */
|
.long .Lretsint8-.Lstore_table /* FFI_TYPE_SINT8 */
|
||||||
.long .Lretuint16 /* FFI_TYPE_UINT16 */
|
.long .Lretuint16-.Lstore_table /* FFI_TYPE_UINT16 */
|
||||||
.long .Lretsint16 /* FFI_TYPE_SINT16 */
|
.long .Lretsint16-.Lstore_table /* FFI_TYPE_SINT16 */
|
||||||
.long .Lretint /* FFI_TYPE_UINT32 */
|
.long .Lretint-.Lstore_table /* FFI_TYPE_UINT32 */
|
||||||
.long .Lretint /* FFI_TYPE_SINT32 */
|
.long .Lretint-.Lstore_table /* FFI_TYPE_SINT32 */
|
||||||
.long .Lretint64 /* FFI_TYPE_UINT64 */
|
.long .Lretint64-.Lstore_table /* FFI_TYPE_UINT64 */
|
||||||
.long .Lretint64 /* FFI_TYPE_SINT64 */
|
.long .Lretint64-.Lstore_table /* FFI_TYPE_SINT64 */
|
||||||
.long .Lretstruct /* FFI_TYPE_STRUCT */
|
.long .Lretstruct-.Lstore_table /* FFI_TYPE_STRUCT */
|
||||||
.long .Lretint /* FFI_TYPE_POINTER */
|
.long .Lretint-.Lstore_table /* FFI_TYPE_POINTER */
|
||||||
.long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
|
.long .Lretstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */
|
||||||
.long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
|
.long .Lretstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */
|
||||||
.long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
|
.long .Lretstruct4b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_4B */
|
||||||
.long .Lretstruct /* FFI_TYPE_MS_STRUCT */
|
.long .Lretstruct-.Lstore_table /* FFI_TYPE_MS_STRUCT */
|
||||||
1:
|
1:
|
||||||
add %ecx, %ecx
|
shl $2, %ecx
|
||||||
add %ecx, %ecx
|
add (%esp),%ecx
|
||||||
|
mov (%ecx),%ecx
|
||||||
add (%esp),%ecx
|
add (%esp),%ecx
|
||||||
add $4, %esp
|
add $4, %esp
|
||||||
jmp *(%ecx)
|
jmp *%ecx
|
||||||
|
|
||||||
/* Sign/zero extend as appropriate. */
|
/* Sign/zero extend as appropriate. */
|
||||||
.Lretsint8:
|
.Lretsint8:
|
||||||
@@ -688,39 +689,49 @@ USCORE_SYMBOL(ffi_closure_SYSV):
|
|||||||
movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */
|
movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */
|
||||||
leal -12(%ebp), %edx
|
leal -12(%ebp), %edx
|
||||||
movl %edx, (%esp) /* &resp */
|
movl %edx, (%esp) /* &resp */
|
||||||
|
#if defined(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE) || !defined(__PIC__)
|
||||||
call USCORE_SYMBOL(ffi_closure_SYSV_inner)
|
call USCORE_SYMBOL(ffi_closure_SYSV_inner)
|
||||||
|
#else
|
||||||
|
movl %ebx, 8(%esp)
|
||||||
|
call 1f
|
||||||
|
1: popl %ebx
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
|
||||||
|
call ffi_closure_SYSV_inner@PLT
|
||||||
|
movl 8(%esp), %ebx
|
||||||
|
#endif
|
||||||
movl -12(%ebp), %ecx
|
movl -12(%ebp), %ecx
|
||||||
|
|
||||||
0:
|
0:
|
||||||
call 1f
|
call 1f
|
||||||
# Do not insert anything here between the call and the jump table.
|
# Do not insert anything here between the call and the jump table.
|
||||||
.Lcls_store_table:
|
.Lcls_store_table:
|
||||||
.long .Lcls_noretval /* FFI_TYPE_VOID */
|
.long .Lcls_noretval-.Lcls_store_table /* FFI_TYPE_VOID */
|
||||||
.long .Lcls_retint /* FFI_TYPE_INT */
|
.long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_INT */
|
||||||
.long .Lcls_retfloat /* FFI_TYPE_FLOAT */
|
.long .Lcls_retfloat-.Lcls_store_table /* FFI_TYPE_FLOAT */
|
||||||
.long .Lcls_retdouble /* FFI_TYPE_DOUBLE */
|
.long .Lcls_retdouble-.Lcls_store_table /* FFI_TYPE_DOUBLE */
|
||||||
.long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */
|
.long .Lcls_retldouble-.Lcls_store_table /* FFI_TYPE_LONGDOUBLE */
|
||||||
.long .Lcls_retuint8 /* FFI_TYPE_UINT8 */
|
.long .Lcls_retuint8-.Lcls_store_table /* FFI_TYPE_UINT8 */
|
||||||
.long .Lcls_retsint8 /* FFI_TYPE_SINT8 */
|
.long .Lcls_retsint8-.Lcls_store_table /* FFI_TYPE_SINT8 */
|
||||||
.long .Lcls_retuint16 /* FFI_TYPE_UINT16 */
|
.long .Lcls_retuint16-.Lcls_store_table /* FFI_TYPE_UINT16 */
|
||||||
.long .Lcls_retsint16 /* FFI_TYPE_SINT16 */
|
.long .Lcls_retsint16-.Lcls_store_table /* FFI_TYPE_SINT16 */
|
||||||
.long .Lcls_retint /* FFI_TYPE_UINT32 */
|
.long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_UINT32 */
|
||||||
.long .Lcls_retint /* FFI_TYPE_SINT32 */
|
.long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_SINT32 */
|
||||||
.long .Lcls_retllong /* FFI_TYPE_UINT64 */
|
.long .Lcls_retllong-.Lcls_store_table /* FFI_TYPE_UINT64 */
|
||||||
.long .Lcls_retllong /* FFI_TYPE_SINT64 */
|
.long .Lcls_retllong-.Lcls_store_table /* FFI_TYPE_SINT64 */
|
||||||
.long .Lcls_retstruct /* FFI_TYPE_STRUCT */
|
.long .Lcls_retstruct-.Lcls_store_table /* FFI_TYPE_STRUCT */
|
||||||
.long .Lcls_retint /* FFI_TYPE_POINTER */
|
.long .Lcls_retint-.Lcls_store_table /* FFI_TYPE_POINTER */
|
||||||
.long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
|
.long .Lcls_retstruct1-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */
|
||||||
.long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
|
.long .Lcls_retstruct2-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */
|
||||||
.long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
|
.long .Lcls_retstruct4-.Lcls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */
|
||||||
.long .Lcls_retmsstruct /* FFI_TYPE_MS_STRUCT */
|
.long .Lcls_retmsstruct-.Lcls_store_table /* FFI_TYPE_MS_STRUCT */
|
||||||
|
|
||||||
1:
|
1:
|
||||||
add %eax, %eax
|
shl $2, %eax
|
||||||
add %eax, %eax
|
add (%esp),%eax
|
||||||
|
mov (%eax),%eax
|
||||||
add (%esp),%eax
|
add (%esp),%eax
|
||||||
add $4, %esp
|
add $4, %esp
|
||||||
jmp *(%eax)
|
jmp *%eax
|
||||||
|
|
||||||
/* Sign/zero extend as appropriate. */
|
/* Sign/zero extend as appropriate. */
|
||||||
.Lcls_retsint8:
|
.Lcls_retsint8:
|
||||||
@@ -846,31 +857,32 @@ USCORE_SYMBOL(ffi_closure_raw_SYSV):
|
|||||||
call 1f
|
call 1f
|
||||||
# Do not insert anything here between the call and the jump table.
|
# Do not insert anything here between the call and the jump table.
|
||||||
.Lrcls_store_table:
|
.Lrcls_store_table:
|
||||||
.long .Lrcls_noretval /* FFI_TYPE_VOID */
|
.long .Lrcls_noretval-.Lrcls_store_table /* FFI_TYPE_VOID */
|
||||||
.long .Lrcls_retint /* FFI_TYPE_INT */
|
.long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_INT */
|
||||||
.long .Lrcls_retfloat /* FFI_TYPE_FLOAT */
|
.long .Lrcls_retfloat-.Lrcls_store_table /* FFI_TYPE_FLOAT */
|
||||||
.long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */
|
.long .Lrcls_retdouble-.Lrcls_store_table /* FFI_TYPE_DOUBLE */
|
||||||
.long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */
|
.long .Lrcls_retldouble-.Lrcls_store_table /* FFI_TYPE_LONGDOUBLE */
|
||||||
.long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */
|
.long .Lrcls_retuint8-.Lrcls_store_table /* FFI_TYPE_UINT8 */
|
||||||
.long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */
|
.long .Lrcls_retsint8-.Lrcls_store_table /* FFI_TYPE_SINT8 */
|
||||||
.long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */
|
.long .Lrcls_retuint16-.Lrcls_store_table /* FFI_TYPE_UINT16 */
|
||||||
.long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */
|
.long .Lrcls_retsint16-.Lrcls_store_table /* FFI_TYPE_SINT16 */
|
||||||
.long .Lrcls_retint /* FFI_TYPE_UINT32 */
|
.long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_UINT32 */
|
||||||
.long .Lrcls_retint /* FFI_TYPE_SINT32 */
|
.long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_SINT32 */
|
||||||
.long .Lrcls_retllong /* FFI_TYPE_UINT64 */
|
.long .Lrcls_retllong-.Lrcls_store_table /* FFI_TYPE_UINT64 */
|
||||||
.long .Lrcls_retllong /* FFI_TYPE_SINT64 */
|
.long .Lrcls_retllong-.Lrcls_store_table /* FFI_TYPE_SINT64 */
|
||||||
.long .Lrcls_retstruct /* FFI_TYPE_STRUCT */
|
.long .Lrcls_retstruct-.Lrcls_store_table /* FFI_TYPE_STRUCT */
|
||||||
.long .Lrcls_retint /* FFI_TYPE_POINTER */
|
.long .Lrcls_retint-.Lrcls_store_table /* FFI_TYPE_POINTER */
|
||||||
.long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
|
.long .Lrcls_retstruct1-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */
|
||||||
.long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
|
.long .Lrcls_retstruct2-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */
|
||||||
.long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
|
.long .Lrcls_retstruct4-.Lrcls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */
|
||||||
.long .Lrcls_retstruct /* FFI_TYPE_MS_STRUCT */
|
.long .Lrcls_retstruct-.Lrcls_store_table /* FFI_TYPE_MS_STRUCT */
|
||||||
1:
|
1:
|
||||||
add %eax, %eax
|
shl $2, %eax
|
||||||
add %eax, %eax
|
add (%esp),%eax
|
||||||
|
mov (%eax),%eax
|
||||||
add (%esp),%eax
|
add (%esp),%eax
|
||||||
add $4, %esp
|
add $4, %esp
|
||||||
jmp *(%eax)
|
jmp *%eax
|
||||||
|
|
||||||
/* Sign/zero extend as appropriate. */
|
/* Sign/zero extend as appropriate. */
|
||||||
.Lrcls_retsint8:
|
.Lrcls_retsint8:
|
||||||
@@ -956,36 +968,46 @@ USCORE_SYMBOL(ffi_closure_STDCALL):
|
|||||||
movl %edx, 4(%esp) /* args */
|
movl %edx, 4(%esp) /* args */
|
||||||
leal -12(%ebp), %edx
|
leal -12(%ebp), %edx
|
||||||
movl %edx, (%esp) /* &resp */
|
movl %edx, (%esp) /* &resp */
|
||||||
|
#if defined(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE) || !defined(__PIC__)
|
||||||
call USCORE_SYMBOL(ffi_closure_SYSV_inner)
|
call USCORE_SYMBOL(ffi_closure_SYSV_inner)
|
||||||
|
#else
|
||||||
|
movl %ebx, 8(%esp)
|
||||||
|
call 1f
|
||||||
|
1: popl %ebx
|
||||||
|
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
|
||||||
|
call ffi_closure_SYSV_inner@PLT
|
||||||
|
movl 8(%esp), %ebx
|
||||||
|
#endif
|
||||||
movl -12(%ebp), %ecx
|
movl -12(%ebp), %ecx
|
||||||
0:
|
0:
|
||||||
call 1f
|
call 1f
|
||||||
# Do not insert anything here between the call and the jump table.
|
# Do not insert anything here between the call and the jump table.
|
||||||
.Lscls_store_table:
|
.Lscls_store_table:
|
||||||
.long .Lscls_noretval /* FFI_TYPE_VOID */
|
.long .Lscls_noretval-.Lscls_store_table /* FFI_TYPE_VOID */
|
||||||
.long .Lscls_retint /* FFI_TYPE_INT */
|
.long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_INT */
|
||||||
.long .Lscls_retfloat /* FFI_TYPE_FLOAT */
|
.long .Lscls_retfloat-.Lscls_store_table /* FFI_TYPE_FLOAT */
|
||||||
.long .Lscls_retdouble /* FFI_TYPE_DOUBLE */
|
.long .Lscls_retdouble-.Lscls_store_table /* FFI_TYPE_DOUBLE */
|
||||||
.long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */
|
.long .Lscls_retldouble-.Lscls_store_table /* FFI_TYPE_LONGDOUBLE */
|
||||||
.long .Lscls_retuint8 /* FFI_TYPE_UINT8 */
|
.long .Lscls_retuint8-.Lscls_store_table /* FFI_TYPE_UINT8 */
|
||||||
.long .Lscls_retsint8 /* FFI_TYPE_SINT8 */
|
.long .Lscls_retsint8-.Lscls_store_table /* FFI_TYPE_SINT8 */
|
||||||
.long .Lscls_retuint16 /* FFI_TYPE_UINT16 */
|
.long .Lscls_retuint16-.Lscls_store_table /* FFI_TYPE_UINT16 */
|
||||||
.long .Lscls_retsint16 /* FFI_TYPE_SINT16 */
|
.long .Lscls_retsint16-.Lscls_store_table /* FFI_TYPE_SINT16 */
|
||||||
.long .Lscls_retint /* FFI_TYPE_UINT32 */
|
.long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_UINT32 */
|
||||||
.long .Lscls_retint /* FFI_TYPE_SINT32 */
|
.long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_SINT32 */
|
||||||
.long .Lscls_retllong /* FFI_TYPE_UINT64 */
|
.long .Lscls_retllong-.Lscls_store_table /* FFI_TYPE_UINT64 */
|
||||||
.long .Lscls_retllong /* FFI_TYPE_SINT64 */
|
.long .Lscls_retllong-.Lscls_store_table /* FFI_TYPE_SINT64 */
|
||||||
.long .Lscls_retstruct /* FFI_TYPE_STRUCT */
|
.long .Lscls_retstruct-.Lscls_store_table /* FFI_TYPE_STRUCT */
|
||||||
.long .Lscls_retint /* FFI_TYPE_POINTER */
|
.long .Lscls_retint-.Lscls_store_table /* FFI_TYPE_POINTER */
|
||||||
.long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
|
.long .Lscls_retstruct1-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_1B */
|
||||||
.long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
|
.long .Lscls_retstruct2-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_2B */
|
||||||
.long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
|
.long .Lscls_retstruct4-.Lscls_store_table /* FFI_TYPE_SMALL_STRUCT_4B */
|
||||||
1:
|
1:
|
||||||
add %eax, %eax
|
shl $2, %eax
|
||||||
add %eax, %eax
|
add (%esp),%eax
|
||||||
|
mov (%eax),%eax
|
||||||
add (%esp),%eax
|
add (%esp),%eax
|
||||||
add $4, %esp
|
add $4, %esp
|
||||||
jmp *(%eax)
|
jmp *%eax
|
||||||
|
|
||||||
/* Sign/zero extend as appropriate. */
|
/* Sign/zero extend as appropriate. */
|
||||||
.Lscls_retsint8:
|
.Lscls_retsint8:
|
||||||
|
|||||||
Reference in New Issue
Block a user