* [PATCH] prelink: apply patch for ARM IFUNC support
@ 2014-08-13 7:20 Yasir Khan
2014-08-13 14:58 ` Mark Hatle
0 siblings, 1 reply; 4+ messages in thread
From: Yasir Khan @ 2014-08-13 7:20 UTC (permalink / raw)
To: openembedded-core
From: Yasir-Khan <yasir_khan@mentor.com>
From Julian Brown, see
http://sourcery.sje.mentorg.com/pipermail/gnu-arm-releases/2014-April/015072.html.
Signed-off-by: Christopher Larson <kergoth@gmail.com>
Signed-off-by: Yasir-Khan <yasir_khan@mentor.com>
---
.../prelink/prelink/arm-ifunc.patch | 264 ++++++++++++++++++++
meta/recipes-devtools/prelink/prelink_git.bb | 4 +-
2 files changed, 267 insertions(+), 1 deletion(-)
create mode 100644 meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
diff --git a/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
new file mode 100644
index 0000000..b63affc
--- /dev/null
+++ b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
@@ -0,0 +1,264 @@
+Kyle McMartin <kmcmartin@redhat.com>
+Jakub Jelinek <jakub@redhat.com>
+Julian Brown <julian@codesourcery.com>
+
+* testsuite/ifunc.h: Add ARM support.
+* src/prelink.h (R_ARM_IRELATIVE): Define.
+* src/arch-arm.c (arm_adjust_rel, arm_adjust_rela)
+(arm_prelink_rel, arm_prelink_rela, arm_apply_conflict_rela)
+(arm_rela_to_rel, arm_rel_to_rela, arm_undo_prelink_rel):
+Handle R_ARM_IRELATIVE.
+(arm_prelink_conflict_rel, arm_prelink_conflict_rela): Handle
+R_ARM_IRELATIVE, ifunc conflicts.
+
+Upstream-Status: Pending [This is applied to the CodeBench toolchain, but not to upstream prelink, nor to prelink-cross]
+
+Index: trunk/src/arch-arm.c
+===================================================================
+--- trunk.orig/src/arch-arm.c 2014-04-25 16:07:02.190843841 -0700
++++ trunk/src/arch-arm.c 2014-04-25 16:08:12.211355745 -0700
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001, 2002, 2004, 2009, 2011 Red Hat, Inc.
++/* Copyright (C) 2001, 2002, 2004, 2009, 2011, 2013 Red Hat, Inc.
+ Written by Jakub Jelinek <jakub@redhat.com>, 2001.
+
+ This program is free software; you can redistribute it and/or modify
+@@ -80,6 +80,7 @@
+ {
+ case R_ARM_RELATIVE:
+ case R_ARM_JUMP_SLOT:
++ case R_ARM_IRELATIVE:
+ data = read_une32 (dso, rel->r_offset);
+ if (data >= start)
+ write_ne32 (dso, rel->r_offset, data + adjust);
+@@ -97,6 +98,7 @@
+ switch (GELF_R_TYPE (rela->r_info))
+ {
+ case R_ARM_RELATIVE:
++ case R_ARM_IRELATIVE:
+ if ((Elf32_Addr) rela->r_addend >= start)
+ {
+ rela->r_addend += (Elf32_Sword) adjust;
+@@ -123,6 +125,7 @@
+ Elf32_Sword val;
+
+ if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
++ || GELF_R_TYPE (rel->r_info) == R_ARM_IRELATIVE
+ || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
+ /* Fast path: nothing to do. */
+ return 0;
+@@ -212,6 +215,7 @@
+ Elf32_Sword val;
+
+ if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
++ || GELF_R_TYPE (rela->r_info) == R_ARM_IRELATIVE
+ || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
+ /* Fast path: nothing to do. */
+ return 0;
+@@ -293,6 +297,8 @@
+ arm_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
+ char *buf, GElf_Addr dest_addr)
+ {
++ GElf_Rela *ret;
++
+ switch (GELF_R_TYPE (rela->r_info))
+ {
+ case R_ARM_GLOB_DAT:
+@@ -300,6 +306,16 @@
+ case R_ARM_ABS32:
+ buf_write_ne32 (info->dso, buf, rela->r_addend);
+ break;
++ case R_ARM_IRELATIVE:
++ if (dest_addr == 0)
++ return 5;
++ ret = prelink_conflict_add_rela (info);
++ if (ret == NULL)
++ return 1;
++ ret->r_offset = dest_addr;
++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
++ ret->r_addend = rela->r_addend;
++ break;
+ default:
+ abort ();
+ }
+@@ -399,35 +415,31 @@
+ GElf_Rela *ret;
+
+ if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
+- || GELF_R_TYPE (rel->r_info) == R_ARM_NONE
+- || info->dso == dso)
++ || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
+ /* Fast path: nothing to do. */
+ return 0;
+ conflict = prelink_conflict (info, GELF_R_SYM (rel->r_info),
+ GELF_R_TYPE (rel->r_info));
+ if (conflict == NULL)
+ {
+- if (info->curtls == NULL)
+- return 0;
+-
+ switch (GELF_R_TYPE (rel->r_info))
+ {
+ /* Even local DTPMOD and TPOFF relocs need conflicts. */
+ case R_ARM_TLS_DTPMOD32:
+ case R_ARM_TLS_TPOFF32:
++ if (info->curtls == NULL || info->dso == dso)
++ return 0;
++ break;
++ /* Similarly IRELATIVE relocations always need conflicts. */
++ case R_ARM_IRELATIVE:
+ break;
+-
+ default:
+ return 0;
+ }
+ value = 0;
+ }
+- else if (conflict->ifunc)
+- {
+- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
+- dso->filename);
+- return 1;
+- }
++ else if (info->dso == dso && !conflict->ifunc)
++ return 0;
+ else
+ {
+ /* DTPOFF32 wants to see only real conflicts, not lookups
+@@ -450,6 +462,11 @@
+ case R_ARM_GLOB_DAT:
+ case R_ARM_JUMP_SLOT:
+ ret->r_addend = (Elf32_Sword) value;
++ if (conflict != NULL && conflict->ifunc)
++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
++ break;
++ case R_ARM_IRELATIVE:
++ ret->r_addend = (Elf32_Sword) read_une32 (dso, rel->r_offset);
+ break;
+ case R_ARM_ABS32:
+ case R_ARM_PC24:
+@@ -508,8 +525,7 @@
+ Elf32_Sword val;
+
+ if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
+- || GELF_R_TYPE (rela->r_info) == R_ARM_NONE
+- || info->dso == dso)
++ || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
+ /* Fast path: nothing to do. */
+ return 0;
+ conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info),
+@@ -517,27 +533,24 @@
+
+ if (conflict == NULL)
+ {
+- if (info->curtls == NULL)
+- return 0;
+-
+ switch (GELF_R_TYPE (rela->r_info))
+ {
+ /* Even local DTPMOD and TPOFF relocs need conflicts. */
+ case R_ARM_TLS_DTPMOD32:
+ case R_ARM_TLS_TPOFF32:
++ if (info->curtls == NULL || info->dso == dso)
++ return 0;
++ break;
++ /* Similarly IRELATIVE relocations always need conflicts. */
++ case R_ARM_IRELATIVE:
+ break;
+-
+ default:
+ return 0;
+ }
+ value = 0;
+ }
+- else if (conflict->ifunc)
+- {
+- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
+- dso->filename);
+- return 1;
+- }
++ else if (info->dso == dso && !conflict->ifunc)
++ return 0;
+ else
+ {
+ /* DTPOFF32 wants to see only real conflicts, not lookups
+@@ -560,7 +573,10 @@
+ case R_ARM_GLOB_DAT:
+ case R_ARM_JUMP_SLOT:
+ case R_ARM_ABS32:
++ case R_ARM_IRELATIVE:
+ ret->r_addend = (Elf32_Sword) (value + rela->r_addend);
++ if (conflict && conflict->ifunc)
++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
+ break;
+ case R_ARM_PC24:
+ val = value + rela->r_addend - rela->r_offset;
+@@ -625,6 +641,7 @@
+ /* We should be never converting .rel.plt into .rela.plt. */
+ abort ();
+ case R_ARM_RELATIVE:
++ case R_ARM_IRELATIVE:
+ case R_ARM_ABS32:
+ case R_ARM_TLS_TPOFF32:
+ case R_ARM_TLS_DTPOFF32:
+@@ -656,6 +673,7 @@
+ and thus never .rela.plt back to .rel.plt. */
+ abort ();
+ case R_ARM_RELATIVE:
++ case R_ARM_IRELATIVE:
+ case R_ARM_ABS32:
+ case R_ARM_TLS_TPOFF32:
+ case R_ARM_TLS_DTPOFF32:
+@@ -794,6 +812,7 @@
+ switch (GELF_R_TYPE (rel->r_info))
+ {
+ case R_ARM_RELATIVE:
++ case R_ARM_IRELATIVE:
+ case R_ARM_NONE:
+ break;
+ case R_ARM_JUMP_SLOT:
+Index: trunk/src/prelink.h
+===================================================================
+--- trunk.orig/src/prelink.h 2014-04-25 16:07:02.000000000 -0700
++++ trunk/src/prelink.h 2014-04-25 16:08:12.235355916 -0700
+@@ -145,6 +145,10 @@
+ #define R_390_IRELATIVE 61
+ #endif
+
++#ifndef R_ARM_IRELATIVE
++#define R_ARM_IRELATIVE 160
++#endif
++
+ struct prelink_entry;
+ struct prelink_info;
+ struct PLArch;
+Index: trunk/testsuite/ifunc.h
+===================================================================
+--- trunk.orig/testsuite/ifunc.h 2014-04-25 16:07:02.000000000 -0700
++++ trunk/testsuite/ifunc.h 2014-04-25 16:08:43.831585698 -0700
+@@ -35,6 +35,25 @@
+ IFUNC_ASM (PICK (fn1, fn2)) \
+ "\t.size " #name ", .-.L" #name "\n")
+ # endif
++#elif defined __arm__
++# ifdef __thumb__
++# define PIPE_OFFSET "4"
++# else
++# define PIPE_OFFSET "8"
++# endif
++# define IFUNC_ASM(fn) \
++ "\tldr r0, .L" fn "\n" \
++ "1:\tadd r0, pc, r0\n" \
++ "\tmov pc, lr\n" \
++ ".L" fn ": .long " fn " - 1b - " PIPE_OFFSET "\n"
++# define IFUNC_DECL(name, hidden, fn1, fn2) \
++asm (".text\n" \
++ "\t.globl " #name "\n" \
++ "\t" hidden " " #name "\n" \
++ "\t.type " #name ", %gnu_indirect_function\n" \
++ #name ":\n" \
++ IFUNC_ASM (PICK (fn1, fn2)) \
++ "\t.size " #name ", .-" #name "\n")
+ #else
+ # error Architecture not supported
+ #endif
diff --git a/meta/recipes-devtools/prelink/prelink_git.bb b/meta/recipes-devtools/prelink/prelink_git.bb
index 3288822..5aa850d 100644
--- a/meta/recipes-devtools/prelink/prelink_git.bb
+++ b/meta/recipes-devtools/prelink/prelink_git.bb
@@ -30,7 +30,9 @@ SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink \
file://prelink.conf \
file://prelink.cron.daily \
file://prelink.default \
- file://macros.prelink"
+ file://macros.prelink \
+ file://arm-ifunc.patch \
+"
TARGET_OS_ORIG := "${TARGET_OS}"
OVERRIDES_append = ":${TARGET_OS_ORIG}"
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] prelink: apply patch for ARM IFUNC support
2014-08-13 7:20 [PATCH] prelink: apply patch for ARM IFUNC support Yasir Khan
@ 2014-08-13 14:58 ` Mark Hatle
2014-08-25 19:53 ` Khan, Yasir
0 siblings, 1 reply; 4+ messages in thread
From: Mark Hatle @ 2014-08-13 14:58 UTC (permalink / raw)
To: openembedded-core
Just an FYI, this does not apply with the top of the tree cross-prelink. (I
have attempted to apply it to the staging tree, but I'm unclear who the original
author is of this..)
The change has been made to the cross_prelink_staging branch, see:
http://git.yoctoproject.org/cgit/cgit.cgi/prelink-cross/commit/?h=cross_prelink_staging&id=3b381e6595be052baa7705ddb318ea3bf9b95cf2
If this is not correct (especially the patch author or other attributions,
please let me know...)
Also if you could verify the problem being fixed/new feature, I would appreciate
it..
On 8/13/14, 2:20 AM, Yasir Khan wrote:
> From: Yasir-Khan <yasir_khan@mentor.com>
>
> From Julian Brown, see
> http://sourcery.sje.mentorg.com/pipermail/gnu-arm-releases/2014-April/015072.html.
Also the above appears to be an internal to Mentor address. Since we can't read
this, it would be helpful to quote the relevant information into the commit
message, as I can only guess [based on what this is doing] as to why the change
is needed.
--Mark
> Signed-off-by: Christopher Larson <kergoth@gmail.com>
> Signed-off-by: Yasir-Khan <yasir_khan@mentor.com>
> ---
> .../prelink/prelink/arm-ifunc.patch | 264 ++++++++++++++++++++
> meta/recipes-devtools/prelink/prelink_git.bb | 4 +-
> 2 files changed, 267 insertions(+), 1 deletion(-)
> create mode 100644 meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
>
> diff --git a/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
> new file mode 100644
> index 0000000..b63affc
> --- /dev/null
> +++ b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
> @@ -0,0 +1,264 @@
> +Kyle McMartin <kmcmartin@redhat.com>
> +Jakub Jelinek <jakub@redhat.com>
> +Julian Brown <julian@codesourcery.com>
> +
> +* testsuite/ifunc.h: Add ARM support.
> +* src/prelink.h (R_ARM_IRELATIVE): Define.
> +* src/arch-arm.c (arm_adjust_rel, arm_adjust_rela)
> +(arm_prelink_rel, arm_prelink_rela, arm_apply_conflict_rela)
> +(arm_rela_to_rel, arm_rel_to_rela, arm_undo_prelink_rel):
> +Handle R_ARM_IRELATIVE.
> +(arm_prelink_conflict_rel, arm_prelink_conflict_rela): Handle
> +R_ARM_IRELATIVE, ifunc conflicts.
> +
> +Upstream-Status: Pending [This is applied to the CodeBench toolchain, but not to upstream prelink, nor to prelink-cross]
> +
> +Index: trunk/src/arch-arm.c
> +===================================================================
> +--- trunk.orig/src/arch-arm.c 2014-04-25 16:07:02.190843841 -0700
> ++++ trunk/src/arch-arm.c 2014-04-25 16:08:12.211355745 -0700
> +@@ -1,4 +1,4 @@
> +-/* Copyright (C) 2001, 2002, 2004, 2009, 2011 Red Hat, Inc.
> ++/* Copyright (C) 2001, 2002, 2004, 2009, 2011, 2013 Red Hat, Inc.
> + Written by Jakub Jelinek <jakub@redhat.com>, 2001.
> +
> + This program is free software; you can redistribute it and/or modify
> +@@ -80,6 +80,7 @@
> + {
> + case R_ARM_RELATIVE:
> + case R_ARM_JUMP_SLOT:
> ++ case R_ARM_IRELATIVE:
> + data = read_une32 (dso, rel->r_offset);
> + if (data >= start)
> + write_ne32 (dso, rel->r_offset, data + adjust);
> +@@ -97,6 +98,7 @@
> + switch (GELF_R_TYPE (rela->r_info))
> + {
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + if ((Elf32_Addr) rela->r_addend >= start)
> + {
> + rela->r_addend += (Elf32_Sword) adjust;
> +@@ -123,6 +125,7 @@
> + Elf32_Sword val;
> +
> + if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
> ++ || GELF_R_TYPE (rel->r_info) == R_ARM_IRELATIVE
> + || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> +@@ -212,6 +215,7 @@
> + Elf32_Sword val;
> +
> + if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
> ++ || GELF_R_TYPE (rela->r_info) == R_ARM_IRELATIVE
> + || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> +@@ -293,6 +297,8 @@
> + arm_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
> + char *buf, GElf_Addr dest_addr)
> + {
> ++ GElf_Rela *ret;
> ++
> + switch (GELF_R_TYPE (rela->r_info))
> + {
> + case R_ARM_GLOB_DAT:
> +@@ -300,6 +306,16 @@
> + case R_ARM_ABS32:
> + buf_write_ne32 (info->dso, buf, rela->r_addend);
> + break;
> ++ case R_ARM_IRELATIVE:
> ++ if (dest_addr == 0)
> ++ return 5;
> ++ ret = prelink_conflict_add_rela (info);
> ++ if (ret == NULL)
> ++ return 1;
> ++ ret->r_offset = dest_addr;
> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
> ++ ret->r_addend = rela->r_addend;
> ++ break;
> + default:
> + abort ();
> + }
> +@@ -399,35 +415,31 @@
> + GElf_Rela *ret;
> +
> + if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
> +- || GELF_R_TYPE (rel->r_info) == R_ARM_NONE
> +- || info->dso == dso)
> ++ || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> + conflict = prelink_conflict (info, GELF_R_SYM (rel->r_info),
> + GELF_R_TYPE (rel->r_info));
> + if (conflict == NULL)
> + {
> +- if (info->curtls == NULL)
> +- return 0;
> +-
> + switch (GELF_R_TYPE (rel->r_info))
> + {
> + /* Even local DTPMOD and TPOFF relocs need conflicts. */
> + case R_ARM_TLS_DTPMOD32:
> + case R_ARM_TLS_TPOFF32:
> ++ if (info->curtls == NULL || info->dso == dso)
> ++ return 0;
> ++ break;
> ++ /* Similarly IRELATIVE relocations always need conflicts. */
> ++ case R_ARM_IRELATIVE:
> + break;
> +-
> + default:
> + return 0;
> + }
> + value = 0;
> + }
> +- else if (conflict->ifunc)
> +- {
> +- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
> +- dso->filename);
> +- return 1;
> +- }
> ++ else if (info->dso == dso && !conflict->ifunc)
> ++ return 0;
> + else
> + {
> + /* DTPOFF32 wants to see only real conflicts, not lookups
> +@@ -450,6 +462,11 @@
> + case R_ARM_GLOB_DAT:
> + case R_ARM_JUMP_SLOT:
> + ret->r_addend = (Elf32_Sword) value;
> ++ if (conflict != NULL && conflict->ifunc)
> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
> ++ break;
> ++ case R_ARM_IRELATIVE:
> ++ ret->r_addend = (Elf32_Sword) read_une32 (dso, rel->r_offset);
> + break;
> + case R_ARM_ABS32:
> + case R_ARM_PC24:
> +@@ -508,8 +525,7 @@
> + Elf32_Sword val;
> +
> + if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
> +- || GELF_R_TYPE (rela->r_info) == R_ARM_NONE
> +- || info->dso == dso)
> ++ || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> + conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info),
> +@@ -517,27 +533,24 @@
> +
> + if (conflict == NULL)
> + {
> +- if (info->curtls == NULL)
> +- return 0;
> +-
> + switch (GELF_R_TYPE (rela->r_info))
> + {
> + /* Even local DTPMOD and TPOFF relocs need conflicts. */
> + case R_ARM_TLS_DTPMOD32:
> + case R_ARM_TLS_TPOFF32:
> ++ if (info->curtls == NULL || info->dso == dso)
> ++ return 0;
> ++ break;
> ++ /* Similarly IRELATIVE relocations always need conflicts. */
> ++ case R_ARM_IRELATIVE:
> + break;
> +-
> + default:
> + return 0;
> + }
> + value = 0;
> + }
> +- else if (conflict->ifunc)
> +- {
> +- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
> +- dso->filename);
> +- return 1;
> +- }
> ++ else if (info->dso == dso && !conflict->ifunc)
> ++ return 0;
> + else
> + {
> + /* DTPOFF32 wants to see only real conflicts, not lookups
> +@@ -560,7 +573,10 @@
> + case R_ARM_GLOB_DAT:
> + case R_ARM_JUMP_SLOT:
> + case R_ARM_ABS32:
> ++ case R_ARM_IRELATIVE:
> + ret->r_addend = (Elf32_Sword) (value + rela->r_addend);
> ++ if (conflict && conflict->ifunc)
> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
> + break;
> + case R_ARM_PC24:
> + val = value + rela->r_addend - rela->r_offset;
> +@@ -625,6 +641,7 @@
> + /* We should be never converting .rel.plt into .rela.plt. */
> + abort ();
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + case R_ARM_ABS32:
> + case R_ARM_TLS_TPOFF32:
> + case R_ARM_TLS_DTPOFF32:
> +@@ -656,6 +673,7 @@
> + and thus never .rela.plt back to .rel.plt. */
> + abort ();
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + case R_ARM_ABS32:
> + case R_ARM_TLS_TPOFF32:
> + case R_ARM_TLS_DTPOFF32:
> +@@ -794,6 +812,7 @@
> + switch (GELF_R_TYPE (rel->r_info))
> + {
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + case R_ARM_NONE:
> + break;
> + case R_ARM_JUMP_SLOT:
> +Index: trunk/src/prelink.h
> +===================================================================
> +--- trunk.orig/src/prelink.h 2014-04-25 16:07:02.000000000 -0700
> ++++ trunk/src/prelink.h 2014-04-25 16:08:12.235355916 -0700
> +@@ -145,6 +145,10 @@
> + #define R_390_IRELATIVE 61
> + #endif
> +
> ++#ifndef R_ARM_IRELATIVE
> ++#define R_ARM_IRELATIVE 160
> ++#endif
> ++
> + struct prelink_entry;
> + struct prelink_info;
> + struct PLArch;
> +Index: trunk/testsuite/ifunc.h
> +===================================================================
> +--- trunk.orig/testsuite/ifunc.h 2014-04-25 16:07:02.000000000 -0700
> ++++ trunk/testsuite/ifunc.h 2014-04-25 16:08:43.831585698 -0700
> +@@ -35,6 +35,25 @@
> + IFUNC_ASM (PICK (fn1, fn2)) \
> + "\t.size " #name ", .-.L" #name "\n")
> + # endif
> ++#elif defined __arm__
> ++# ifdef __thumb__
> ++# define PIPE_OFFSET "4"
> ++# else
> ++# define PIPE_OFFSET "8"
> ++# endif
> ++# define IFUNC_ASM(fn) \
> ++ "\tldr r0, .L" fn "\n" \
> ++ "1:\tadd r0, pc, r0\n" \
> ++ "\tmov pc, lr\n" \
> ++ ".L" fn ": .long " fn " - 1b - " PIPE_OFFSET "\n"
> ++# define IFUNC_DECL(name, hidden, fn1, fn2) \
> ++asm (".text\n" \
> ++ "\t.globl " #name "\n" \
> ++ "\t" hidden " " #name "\n" \
> ++ "\t.type " #name ", %gnu_indirect_function\n" \
> ++ #name ":\n" \
> ++ IFUNC_ASM (PICK (fn1, fn2)) \
> ++ "\t.size " #name ", .-" #name "\n")
> + #else
> + # error Architecture not supported
> + #endif
> diff --git a/meta/recipes-devtools/prelink/prelink_git.bb b/meta/recipes-devtools/prelink/prelink_git.bb
> index 3288822..5aa850d 100644
> --- a/meta/recipes-devtools/prelink/prelink_git.bb
> +++ b/meta/recipes-devtools/prelink/prelink_git.bb
> @@ -30,7 +30,9 @@ SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink \
> file://prelink.conf \
> file://prelink.cron.daily \
> file://prelink.default \
> - file://macros.prelink"
> + file://macros.prelink \
> + file://arm-ifunc.patch \
> +"
>
> TARGET_OS_ORIG := "${TARGET_OS}"
> OVERRIDES_append = ":${TARGET_OS_ORIG}"
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] prelink: apply patch for ARM IFUNC support
2014-08-13 14:58 ` Mark Hatle
@ 2014-08-25 19:53 ` Khan, Yasir
2014-08-25 22:09 ` Mark Hatle
0 siblings, 1 reply; 4+ messages in thread
From: Khan, Yasir @ 2014-08-25 19:53 UTC (permalink / raw)
To: Mark Hatle, openembedded-core
Below are the details of the patch from the link which couldn't be opened.
Authors:
Kyle McMartin <kmcmartin@redhat.com>
Jakub Jelinek <jakub@redhat.com>
Julian Brown <julian@codesourcery.com>
Description : "Implement IFUNC support in the prelinker for ARM"
The prelinker patch is a bug-fixed version of the patch from:
https://bugzilla.redhat.com/show_bug.cgi?id=1009601
________________________________________
From: openembedded-core-bounces@lists.openembedded.org [openembedded-core-bounces@lists.openembedded.org] on behalf of Mark Hatle [mark.hatle@windriver.com]
Sent: Wednesday, August 13, 2014 7:58 PM
To: openembedded-core@lists.openembedded.org
Subject: Re: [OE-core] [PATCH] prelink: apply patch for ARM IFUNC support
Just an FYI, this does not apply with the top of the tree cross-prelink. (I
have attempted to apply it to the staging tree, but I'm unclear who the original
author is of this..)
The change has been made to the cross_prelink_staging branch, see:
http://git.yoctoproject.org/cgit/cgit.cgi/prelink-cross/commit/?h=cross_prelink_staging&id=3b381e6595be052baa7705ddb318ea3bf9b95cf2
If this is not correct (especially the patch author or other attributions,
please let me know...)
Also if you could verify the problem being fixed/new feature, I would appreciate
it..
On 8/13/14, 2:20 AM, Yasir Khan wrote:
> From: Yasir-Khan <yasir_khan@mentor.com>
>
> From Julian Brown, see
> http://sourcery.sje.mentorg.com/pipermail/gnu-arm-releases/2014-April/015072.html.
Also the above appears to be an internal to Mentor address. Since we can't read
this, it would be helpful to quote the relevant information into the commit
message, as I can only guess [based on what this is doing] as to why the change
is needed.
--Mark
> Signed-off-by: Christopher Larson <kergoth@gmail.com>
> Signed-off-by: Yasir-Khan <yasir_khan@mentor.com>
> ---
> .../prelink/prelink/arm-ifunc.patch | 264 ++++++++++++++++++++
> meta/recipes-devtools/prelink/prelink_git.bb | 4 +-
> 2 files changed, 267 insertions(+), 1 deletion(-)
> create mode 100644 meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
>
> diff --git a/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
> new file mode 100644
> index 0000000..b63affc
> --- /dev/null
> +++ b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
> @@ -0,0 +1,264 @@
> +Kyle McMartin <kmcmartin@redhat.com>
> +Jakub Jelinek <jakub@redhat.com>
> +Julian Brown <julian@codesourcery.com>
> +
> +* testsuite/ifunc.h: Add ARM support.
> +* src/prelink.h (R_ARM_IRELATIVE): Define.
> +* src/arch-arm.c (arm_adjust_rel, arm_adjust_rela)
> +(arm_prelink_rel, arm_prelink_rela, arm_apply_conflict_rela)
> +(arm_rela_to_rel, arm_rel_to_rela, arm_undo_prelink_rel):
> +Handle R_ARM_IRELATIVE.
> +(arm_prelink_conflict_rel, arm_prelink_conflict_rela): Handle
> +R_ARM_IRELATIVE, ifunc conflicts.
> +
> +Upstream-Status: Pending [This is applied to the CodeBench toolchain, but not to upstream prelink, nor to prelink-cross]
> +
> +Index: trunk/src/arch-arm.c
> +===================================================================
> +--- trunk.orig/src/arch-arm.c 2014-04-25 16:07:02.190843841 -0700
> ++++ trunk/src/arch-arm.c 2014-04-25 16:08:12.211355745 -0700
> +@@ -1,4 +1,4 @@
> +-/* Copyright (C) 2001, 2002, 2004, 2009, 2011 Red Hat, Inc.
> ++/* Copyright (C) 2001, 2002, 2004, 2009, 2011, 2013 Red Hat, Inc.
> + Written by Jakub Jelinek <jakub@redhat.com>, 2001.
> +
> + This program is free software; you can redistribute it and/or modify
> +@@ -80,6 +80,7 @@
> + {
> + case R_ARM_RELATIVE:
> + case R_ARM_JUMP_SLOT:
> ++ case R_ARM_IRELATIVE:
> + data = read_une32 (dso, rel->r_offset);
> + if (data >= start)
> + write_ne32 (dso, rel->r_offset, data + adjust);
> +@@ -97,6 +98,7 @@
> + switch (GELF_R_TYPE (rela->r_info))
> + {
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + if ((Elf32_Addr) rela->r_addend >= start)
> + {
> + rela->r_addend += (Elf32_Sword) adjust;
> +@@ -123,6 +125,7 @@
> + Elf32_Sword val;
> +
> + if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
> ++ || GELF_R_TYPE (rel->r_info) == R_ARM_IRELATIVE
> + || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> +@@ -212,6 +215,7 @@
> + Elf32_Sword val;
> +
> + if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
> ++ || GELF_R_TYPE (rela->r_info) == R_ARM_IRELATIVE
> + || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> +@@ -293,6 +297,8 @@
> + arm_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
> + char *buf, GElf_Addr dest_addr)
> + {
> ++ GElf_Rela *ret;
> ++
> + switch (GELF_R_TYPE (rela->r_info))
> + {
> + case R_ARM_GLOB_DAT:
> +@@ -300,6 +306,16 @@
> + case R_ARM_ABS32:
> + buf_write_ne32 (info->dso, buf, rela->r_addend);
> + break;
> ++ case R_ARM_IRELATIVE:
> ++ if (dest_addr == 0)
> ++ return 5;
> ++ ret = prelink_conflict_add_rela (info);
> ++ if (ret == NULL)
> ++ return 1;
> ++ ret->r_offset = dest_addr;
> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
> ++ ret->r_addend = rela->r_addend;
> ++ break;
> + default:
> + abort ();
> + }
> +@@ -399,35 +415,31 @@
> + GElf_Rela *ret;
> +
> + if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
> +- || GELF_R_TYPE (rel->r_info) == R_ARM_NONE
> +- || info->dso == dso)
> ++ || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> + conflict = prelink_conflict (info, GELF_R_SYM (rel->r_info),
> + GELF_R_TYPE (rel->r_info));
> + if (conflict == NULL)
> + {
> +- if (info->curtls == NULL)
> +- return 0;
> +-
> + switch (GELF_R_TYPE (rel->r_info))
> + {
> + /* Even local DTPMOD and TPOFF relocs need conflicts. */
> + case R_ARM_TLS_DTPMOD32:
> + case R_ARM_TLS_TPOFF32:
> ++ if (info->curtls == NULL || info->dso == dso)
> ++ return 0;
> ++ break;
> ++ /* Similarly IRELATIVE relocations always need conflicts. */
> ++ case R_ARM_IRELATIVE:
> + break;
> +-
> + default:
> + return 0;
> + }
> + value = 0;
> + }
> +- else if (conflict->ifunc)
> +- {
> +- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
> +- dso->filename);
> +- return 1;
> +- }
> ++ else if (info->dso == dso && !conflict->ifunc)
> ++ return 0;
> + else
> + {
> + /* DTPOFF32 wants to see only real conflicts, not lookups
> +@@ -450,6 +462,11 @@
> + case R_ARM_GLOB_DAT:
> + case R_ARM_JUMP_SLOT:
> + ret->r_addend = (Elf32_Sword) value;
> ++ if (conflict != NULL && conflict->ifunc)
> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
> ++ break;
> ++ case R_ARM_IRELATIVE:
> ++ ret->r_addend = (Elf32_Sword) read_une32 (dso, rel->r_offset);
> + break;
> + case R_ARM_ABS32:
> + case R_ARM_PC24:
> +@@ -508,8 +525,7 @@
> + Elf32_Sword val;
> +
> + if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
> +- || GELF_R_TYPE (rela->r_info) == R_ARM_NONE
> +- || info->dso == dso)
> ++ || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
> + /* Fast path: nothing to do. */
> + return 0;
> + conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info),
> +@@ -517,27 +533,24 @@
> +
> + if (conflict == NULL)
> + {
> +- if (info->curtls == NULL)
> +- return 0;
> +-
> + switch (GELF_R_TYPE (rela->r_info))
> + {
> + /* Even local DTPMOD and TPOFF relocs need conflicts. */
> + case R_ARM_TLS_DTPMOD32:
> + case R_ARM_TLS_TPOFF32:
> ++ if (info->curtls == NULL || info->dso == dso)
> ++ return 0;
> ++ break;
> ++ /* Similarly IRELATIVE relocations always need conflicts. */
> ++ case R_ARM_IRELATIVE:
> + break;
> +-
> + default:
> + return 0;
> + }
> + value = 0;
> + }
> +- else if (conflict->ifunc)
> +- {
> +- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
> +- dso->filename);
> +- return 1;
> +- }
> ++ else if (info->dso == dso && !conflict->ifunc)
> ++ return 0;
> + else
> + {
> + /* DTPOFF32 wants to see only real conflicts, not lookups
> +@@ -560,7 +573,10 @@
> + case R_ARM_GLOB_DAT:
> + case R_ARM_JUMP_SLOT:
> + case R_ARM_ABS32:
> ++ case R_ARM_IRELATIVE:
> + ret->r_addend = (Elf32_Sword) (value + rela->r_addend);
> ++ if (conflict && conflict->ifunc)
> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
> + break;
> + case R_ARM_PC24:
> + val = value + rela->r_addend - rela->r_offset;
> +@@ -625,6 +641,7 @@
> + /* We should be never converting .rel.plt into .rela.plt. */
> + abort ();
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + case R_ARM_ABS32:
> + case R_ARM_TLS_TPOFF32:
> + case R_ARM_TLS_DTPOFF32:
> +@@ -656,6 +673,7 @@
> + and thus never .rela.plt back to .rel.plt. */
> + abort ();
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + case R_ARM_ABS32:
> + case R_ARM_TLS_TPOFF32:
> + case R_ARM_TLS_DTPOFF32:
> +@@ -794,6 +812,7 @@
> + switch (GELF_R_TYPE (rel->r_info))
> + {
> + case R_ARM_RELATIVE:
> ++ case R_ARM_IRELATIVE:
> + case R_ARM_NONE:
> + break;
> + case R_ARM_JUMP_SLOT:
> +Index: trunk/src/prelink.h
> +===================================================================
> +--- trunk.orig/src/prelink.h 2014-04-25 16:07:02.000000000 -0700
> ++++ trunk/src/prelink.h 2014-04-25 16:08:12.235355916 -0700
> +@@ -145,6 +145,10 @@
> + #define R_390_IRELATIVE 61
> + #endif
> +
> ++#ifndef R_ARM_IRELATIVE
> ++#define R_ARM_IRELATIVE 160
> ++#endif
> ++
> + struct prelink_entry;
> + struct prelink_info;
> + struct PLArch;
> +Index: trunk/testsuite/ifunc.h
> +===================================================================
> +--- trunk.orig/testsuite/ifunc.h 2014-04-25 16:07:02.000000000 -0700
> ++++ trunk/testsuite/ifunc.h 2014-04-25 16:08:43.831585698 -0700
> +@@ -35,6 +35,25 @@
> + IFUNC_ASM (PICK (fn1, fn2)) \
> + "\t.size " #name ", .-.L" #name "\n")
> + # endif
> ++#elif defined __arm__
> ++# ifdef __thumb__
> ++# define PIPE_OFFSET "4"
> ++# else
> ++# define PIPE_OFFSET "8"
> ++# endif
> ++# define IFUNC_ASM(fn) \
> ++ "\tldr r0, .L" fn "\n" \
> ++ "1:\tadd r0, pc, r0\n" \
> ++ "\tmov pc, lr\n" \
> ++ ".L" fn ": .long " fn " - 1b - " PIPE_OFFSET "\n"
> ++# define IFUNC_DECL(name, hidden, fn1, fn2) \
> ++asm (".text\n" \
> ++ "\t.globl " #name "\n" \
> ++ "\t" hidden " " #name "\n" \
> ++ "\t.type " #name ", %gnu_indirect_function\n" \
> ++ #name ":\n" \
> ++ IFUNC_ASM (PICK (fn1, fn2)) \
> ++ "\t.size " #name ", .-" #name "\n")
> + #else
> + # error Architecture not supported
> + #endif
> diff --git a/meta/recipes-devtools/prelink/prelink_git.bb b/meta/recipes-devtools/prelink/prelink_git.bb
> index 3288822..5aa850d 100644
> --- a/meta/recipes-devtools/prelink/prelink_git.bb
> +++ b/meta/recipes-devtools/prelink/prelink_git.bb
> @@ -30,7 +30,9 @@ SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink \
> file://prelink.conf \
> file://prelink.cron.daily \
> file://prelink.default \
> - file://macros.prelink"
> + file://macros.prelink \
> + file://arm-ifunc.patch \
> +"
>
> TARGET_OS_ORIG := "${TARGET_OS}"
> OVERRIDES_append = ":${TARGET_OS_ORIG}"
>
--
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] prelink: apply patch for ARM IFUNC support
2014-08-25 19:53 ` Khan, Yasir
@ 2014-08-25 22:09 ` Mark Hatle
0 siblings, 0 replies; 4+ messages in thread
From: Mark Hatle @ 2014-08-25 22:09 UTC (permalink / raw)
To: Khan, Yasir, openembedded-core
Thank you for the update. I've updated the cross-prelink staging branch with
this information, see:
http://git.yoctoproject.org/cgit/cgit.cgi/prelink-cross/commit/?h=cross_prelink_staging
Any concerns, please let me know.
--Mark
On 8/25/14, 2:53 PM, Khan, Yasir wrote:
> Below are the details of the patch from the link which couldn't be opened.
>
> Authors:
> Kyle McMartin <kmcmartin@redhat.com>
> Jakub Jelinek <jakub@redhat.com>
> Julian Brown <julian@codesourcery.com>
>
> Description : "Implement IFUNC support in the prelinker for ARM"
> The prelinker patch is a bug-fixed version of the patch from:
> https://bugzilla.redhat.com/show_bug.cgi?id=1009601
>
> ________________________________________
> From: openembedded-core-bounces@lists.openembedded.org [openembedded-core-bounces@lists.openembedded.org] on behalf of Mark Hatle [mark.hatle@windriver.com]
> Sent: Wednesday, August 13, 2014 7:58 PM
> To: openembedded-core@lists.openembedded.org
> Subject: Re: [OE-core] [PATCH] prelink: apply patch for ARM IFUNC support
>
> Just an FYI, this does not apply with the top of the tree cross-prelink. (I
> have attempted to apply it to the staging tree, but I'm unclear who the original
> author is of this..)
>
> The change has been made to the cross_prelink_staging branch, see:
>
> http://git.yoctoproject.org/cgit/cgit.cgi/prelink-cross/commit/?h=cross_prelink_staging&id=3b381e6595be052baa7705ddb318ea3bf9b95cf2
>
> If this is not correct (especially the patch author or other attributions,
> please let me know...)
>
> Also if you could verify the problem being fixed/new feature, I would appreciate
> it..
>
> On 8/13/14, 2:20 AM, Yasir Khan wrote:
>> From: Yasir-Khan <yasir_khan@mentor.com>
>>
>> From Julian Brown, see
>> http://sourcery.sje.mentorg.com/pipermail/gnu-arm-releases/2014-April/015072.html.
>
> Also the above appears to be an internal to Mentor address. Since we can't read
> this, it would be helpful to quote the relevant information into the commit
> message, as I can only guess [based on what this is doing] as to why the change
> is needed.
>
> --Mark
>
>> Signed-off-by: Christopher Larson <kergoth@gmail.com>
>> Signed-off-by: Yasir-Khan <yasir_khan@mentor.com>
>> ---
>> .../prelink/prelink/arm-ifunc.patch | 264 ++++++++++++++++++++
>> meta/recipes-devtools/prelink/prelink_git.bb | 4 +-
>> 2 files changed, 267 insertions(+), 1 deletion(-)
>> create mode 100644 meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
>>
>> diff --git a/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
>> new file mode 100644
>> index 0000000..b63affc
>> --- /dev/null
>> +++ b/meta/recipes-devtools/prelink/prelink/arm-ifunc.patch
>> @@ -0,0 +1,264 @@
>> +Kyle McMartin <kmcmartin@redhat.com>
>> +Jakub Jelinek <jakub@redhat.com>
>> +Julian Brown <julian@codesourcery.com>
>> +
>> +* testsuite/ifunc.h: Add ARM support.
>> +* src/prelink.h (R_ARM_IRELATIVE): Define.
>> +* src/arch-arm.c (arm_adjust_rel, arm_adjust_rela)
>> +(arm_prelink_rel, arm_prelink_rela, arm_apply_conflict_rela)
>> +(arm_rela_to_rel, arm_rel_to_rela, arm_undo_prelink_rel):
>> +Handle R_ARM_IRELATIVE.
>> +(arm_prelink_conflict_rel, arm_prelink_conflict_rela): Handle
>> +R_ARM_IRELATIVE, ifunc conflicts.
>> +
>> +Upstream-Status: Pending [This is applied to the CodeBench toolchain, but not to upstream prelink, nor to prelink-cross]
>> +
>> +Index: trunk/src/arch-arm.c
>> +===================================================================
>> +--- trunk.orig/src/arch-arm.c 2014-04-25 16:07:02.190843841 -0700
>> ++++ trunk/src/arch-arm.c 2014-04-25 16:08:12.211355745 -0700
>> +@@ -1,4 +1,4 @@
>> +-/* Copyright (C) 2001, 2002, 2004, 2009, 2011 Red Hat, Inc.
>> ++/* Copyright (C) 2001, 2002, 2004, 2009, 2011, 2013 Red Hat, Inc.
>> + Written by Jakub Jelinek <jakub@redhat.com>, 2001.
>> +
>> + This program is free software; you can redistribute it and/or modify
>> +@@ -80,6 +80,7 @@
>> + {
>> + case R_ARM_RELATIVE:
>> + case R_ARM_JUMP_SLOT:
>> ++ case R_ARM_IRELATIVE:
>> + data = read_une32 (dso, rel->r_offset);
>> + if (data >= start)
>> + write_ne32 (dso, rel->r_offset, data + adjust);
>> +@@ -97,6 +98,7 @@
>> + switch (GELF_R_TYPE (rela->r_info))
>> + {
>> + case R_ARM_RELATIVE:
>> ++ case R_ARM_IRELATIVE:
>> + if ((Elf32_Addr) rela->r_addend >= start)
>> + {
>> + rela->r_addend += (Elf32_Sword) adjust;
>> +@@ -123,6 +125,7 @@
>> + Elf32_Sword val;
>> +
>> + if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
>> ++ || GELF_R_TYPE (rel->r_info) == R_ARM_IRELATIVE
>> + || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
>> + /* Fast path: nothing to do. */
>> + return 0;
>> +@@ -212,6 +215,7 @@
>> + Elf32_Sword val;
>> +
>> + if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
>> ++ || GELF_R_TYPE (rela->r_info) == R_ARM_IRELATIVE
>> + || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
>> + /* Fast path: nothing to do. */
>> + return 0;
>> +@@ -293,6 +297,8 @@
>> + arm_apply_conflict_rela (struct prelink_info *info, GElf_Rela *rela,
>> + char *buf, GElf_Addr dest_addr)
>> + {
>> ++ GElf_Rela *ret;
>> ++
>> + switch (GELF_R_TYPE (rela->r_info))
>> + {
>> + case R_ARM_GLOB_DAT:
>> +@@ -300,6 +306,16 @@
>> + case R_ARM_ABS32:
>> + buf_write_ne32 (info->dso, buf, rela->r_addend);
>> + break;
>> ++ case R_ARM_IRELATIVE:
>> ++ if (dest_addr == 0)
>> ++ return 5;
>> ++ ret = prelink_conflict_add_rela (info);
>> ++ if (ret == NULL)
>> ++ return 1;
>> ++ ret->r_offset = dest_addr;
>> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
>> ++ ret->r_addend = rela->r_addend;
>> ++ break;
>> + default:
>> + abort ();
>> + }
>> +@@ -399,35 +415,31 @@
>> + GElf_Rela *ret;
>> +
>> + if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE
>> +- || GELF_R_TYPE (rel->r_info) == R_ARM_NONE
>> +- || info->dso == dso)
>> ++ || GELF_R_TYPE (rel->r_info) == R_ARM_NONE)
>> + /* Fast path: nothing to do. */
>> + return 0;
>> + conflict = prelink_conflict (info, GELF_R_SYM (rel->r_info),
>> + GELF_R_TYPE (rel->r_info));
>> + if (conflict == NULL)
>> + {
>> +- if (info->curtls == NULL)
>> +- return 0;
>> +-
>> + switch (GELF_R_TYPE (rel->r_info))
>> + {
>> + /* Even local DTPMOD and TPOFF relocs need conflicts. */
>> + case R_ARM_TLS_DTPMOD32:
>> + case R_ARM_TLS_TPOFF32:
>> ++ if (info->curtls == NULL || info->dso == dso)
>> ++ return 0;
>> ++ break;
>> ++ /* Similarly IRELATIVE relocations always need conflicts. */
>> ++ case R_ARM_IRELATIVE:
>> + break;
>> +-
>> + default:
>> + return 0;
>> + }
>> + value = 0;
>> + }
>> +- else if (conflict->ifunc)
>> +- {
>> +- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
>> +- dso->filename);
>> +- return 1;
>> +- }
>> ++ else if (info->dso == dso && !conflict->ifunc)
>> ++ return 0;
>> + else
>> + {
>> + /* DTPOFF32 wants to see only real conflicts, not lookups
>> +@@ -450,6 +462,11 @@
>> + case R_ARM_GLOB_DAT:
>> + case R_ARM_JUMP_SLOT:
>> + ret->r_addend = (Elf32_Sword) value;
>> ++ if (conflict != NULL && conflict->ifunc)
>> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
>> ++ break;
>> ++ case R_ARM_IRELATIVE:
>> ++ ret->r_addend = (Elf32_Sword) read_une32 (dso, rel->r_offset);
>> + break;
>> + case R_ARM_ABS32:
>> + case R_ARM_PC24:
>> +@@ -508,8 +525,7 @@
>> + Elf32_Sword val;
>> +
>> + if (GELF_R_TYPE (rela->r_info) == R_ARM_RELATIVE
>> +- || GELF_R_TYPE (rela->r_info) == R_ARM_NONE
>> +- || info->dso == dso)
>> ++ || GELF_R_TYPE (rela->r_info) == R_ARM_NONE)
>> + /* Fast path: nothing to do. */
>> + return 0;
>> + conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info),
>> +@@ -517,27 +533,24 @@
>> +
>> + if (conflict == NULL)
>> + {
>> +- if (info->curtls == NULL)
>> +- return 0;
>> +-
>> + switch (GELF_R_TYPE (rela->r_info))
>> + {
>> + /* Even local DTPMOD and TPOFF relocs need conflicts. */
>> + case R_ARM_TLS_DTPMOD32:
>> + case R_ARM_TLS_TPOFF32:
>> ++ if (info->curtls == NULL || info->dso == dso)
>> ++ return 0;
>> ++ break;
>> ++ /* Similarly IRELATIVE relocations always need conflicts. */
>> ++ case R_ARM_IRELATIVE:
>> + break;
>> +-
>> + default:
>> + return 0;
>> + }
>> + value = 0;
>> + }
>> +- else if (conflict->ifunc)
>> +- {
>> +- error (0, 0, "%s: STT_GNU_IFUNC not handled on ARM yet",
>> +- dso->filename);
>> +- return 1;
>> +- }
>> ++ else if (info->dso == dso && !conflict->ifunc)
>> ++ return 0;
>> + else
>> + {
>> + /* DTPOFF32 wants to see only real conflicts, not lookups
>> +@@ -560,7 +573,10 @@
>> + case R_ARM_GLOB_DAT:
>> + case R_ARM_JUMP_SLOT:
>> + case R_ARM_ABS32:
>> ++ case R_ARM_IRELATIVE:
>> + ret->r_addend = (Elf32_Sword) (value + rela->r_addend);
>> ++ if (conflict && conflict->ifunc)
>> ++ ret->r_info = GELF_R_INFO (0, R_ARM_IRELATIVE);
>> + break;
>> + case R_ARM_PC24:
>> + val = value + rela->r_addend - rela->r_offset;
>> +@@ -625,6 +641,7 @@
>> + /* We should be never converting .rel.plt into .rela.plt. */
>> + abort ();
>> + case R_ARM_RELATIVE:
>> ++ case R_ARM_IRELATIVE:
>> + case R_ARM_ABS32:
>> + case R_ARM_TLS_TPOFF32:
>> + case R_ARM_TLS_DTPOFF32:
>> +@@ -656,6 +673,7 @@
>> + and thus never .rela.plt back to .rel.plt. */
>> + abort ();
>> + case R_ARM_RELATIVE:
>> ++ case R_ARM_IRELATIVE:
>> + case R_ARM_ABS32:
>> + case R_ARM_TLS_TPOFF32:
>> + case R_ARM_TLS_DTPOFF32:
>> +@@ -794,6 +812,7 @@
>> + switch (GELF_R_TYPE (rel->r_info))
>> + {
>> + case R_ARM_RELATIVE:
>> ++ case R_ARM_IRELATIVE:
>> + case R_ARM_NONE:
>> + break;
>> + case R_ARM_JUMP_SLOT:
>> +Index: trunk/src/prelink.h
>> +===================================================================
>> +--- trunk.orig/src/prelink.h 2014-04-25 16:07:02.000000000 -0700
>> ++++ trunk/src/prelink.h 2014-04-25 16:08:12.235355916 -0700
>> +@@ -145,6 +145,10 @@
>> + #define R_390_IRELATIVE 61
>> + #endif
>> +
>> ++#ifndef R_ARM_IRELATIVE
>> ++#define R_ARM_IRELATIVE 160
>> ++#endif
>> ++
>> + struct prelink_entry;
>> + struct prelink_info;
>> + struct PLArch;
>> +Index: trunk/testsuite/ifunc.h
>> +===================================================================
>> +--- trunk.orig/testsuite/ifunc.h 2014-04-25 16:07:02.000000000 -0700
>> ++++ trunk/testsuite/ifunc.h 2014-04-25 16:08:43.831585698 -0700
>> +@@ -35,6 +35,25 @@
>> + IFUNC_ASM (PICK (fn1, fn2)) \
>> + "\t.size " #name ", .-.L" #name "\n")
>> + # endif
>> ++#elif defined __arm__
>> ++# ifdef __thumb__
>> ++# define PIPE_OFFSET "4"
>> ++# else
>> ++# define PIPE_OFFSET "8"
>> ++# endif
>> ++# define IFUNC_ASM(fn) \
>> ++ "\tldr r0, .L" fn "\n" \
>> ++ "1:\tadd r0, pc, r0\n" \
>> ++ "\tmov pc, lr\n" \
>> ++ ".L" fn ": .long " fn " - 1b - " PIPE_OFFSET "\n"
>> ++# define IFUNC_DECL(name, hidden, fn1, fn2) \
>> ++asm (".text\n" \
>> ++ "\t.globl " #name "\n" \
>> ++ "\t" hidden " " #name "\n" \
>> ++ "\t.type " #name ", %gnu_indirect_function\n" \
>> ++ #name ":\n" \
>> ++ IFUNC_ASM (PICK (fn1, fn2)) \
>> ++ "\t.size " #name ", .-" #name "\n")
>> + #else
>> + # error Architecture not supported
>> + #endif
>> diff --git a/meta/recipes-devtools/prelink/prelink_git.bb b/meta/recipes-devtools/prelink/prelink_git.bb
>> index 3288822..5aa850d 100644
>> --- a/meta/recipes-devtools/prelink/prelink_git.bb
>> +++ b/meta/recipes-devtools/prelink/prelink_git.bb
>> @@ -30,7 +30,9 @@ SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink \
>> file://prelink.conf \
>> file://prelink.cron.daily \
>> file://prelink.default \
>> - file://macros.prelink"
>> + file://macros.prelink \
>> + file://arm-ifunc.patch \
>> +"
>>
>> TARGET_OS_ORIG := "${TARGET_OS}"
>> OVERRIDES_append = ":${TARGET_OS_ORIG}"
>>
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-08-25 22:09 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-13 7:20 [PATCH] prelink: apply patch for ARM IFUNC support Yasir Khan
2014-08-13 14:58 ` Mark Hatle
2014-08-25 19:53 ` Khan, Yasir
2014-08-25 22:09 ` Mark Hatle
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.