summaryrefslogtreecommitdiff
path: root/cgaas.c
diff options
context:
space:
mode:
authorJohn van Groningen2013-08-01 12:36:27 +0000
committerJohn van Groningen2013-08-01 12:36:27 +0000
commitda93f14017d6414250593308f0c79631173ca6d9 (patch)
tree2860923f0931f705730f68ca4ea98268f37d6eb5 /cgaas.c
parentfix offsets in descriptors, for position independent code on linux (diff)
use 64 instead of 32 bit address in indirect jump for position independent code on linux
Diffstat (limited to 'cgaas.c')
-rw-r--r--cgaas.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/cgaas.c b/cgaas.c
index 822fabb..556f82a 100644
--- a/cgaas.c
+++ b/cgaas.c
@@ -2401,12 +2401,18 @@ static void as_jmp_instruction (struct instruction *instruction)
as_branch_label (instruction->instruction_parameters[0].parameter_data.l,JUMP_RELOCATION);
break;
case P_INDIRECT:
- if (instruction->instruction_parameters[0].parameter_offset!=0){
+#ifndef MACH_O64
+ if (
+# ifdef LINUX
+ !pic_flag &&
+# endif
+ instruction->instruction_parameters[0].parameter_offset!=0){
as_id_r (0x63,instruction->instruction_parameters[0].parameter_offset,
instruction->instruction_parameters[0].parameter_data.reg.r,REGISTER_O0); /* movsxd */
store_c (0377);
store_c (0340 | reg_num (REGISTER_O0));
} else
+#endif
as_id_rex (0377,040,instruction->instruction_parameters[0].parameter_offset,
instruction->instruction_parameters[0].parameter_data.reg.r);
break;