summaryrefslogtreecommitdiff
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
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
-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;