From: Mark Hatle <mark.hatle@windriver.com>
To: <openembedded-core@lists.openembedded.org>
Subject: Re: [PATCH] prelink: apply patch for ARM IFUNC support
Date: Wed, 13 Aug 2014 09:58:17 -0500 [thread overview]
Message-ID: <53EB7D09.8090202@windriver.com> (raw)
In-Reply-To: <1407914400-50293-1-git-send-email-yasir_khan@mentor.com>
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}"
>
next prev parent reply other threads:[~2014-08-13 14:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-13 7:20 [PATCH] prelink: apply patch for ARM IFUNC support Yasir Khan
2014-08-13 14:58 ` Mark Hatle [this message]
2014-08-25 19:53 ` Khan, Yasir
2014-08-25 22:09 ` Mark Hatle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53EB7D09.8090202@windriver.com \
--to=mark.hatle@windriver.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.