From: Mark Hatle <mark.hatle@windriver.com>
To: <maninder1.s@samsung.com>,
"yocto@yoctoproject.org" <yocto@yoctoproject.org>
Cc: "v.narang@samsung.com" <v.narang@samsung.com>,
AJEET YADAV <ajeet.y@samsung.com>
Subject: Re: [EDT][prelink-cross] LD_PRELOAD Implementation in Prelink
Date: Fri, 11 Sep 2015 09:10:24 -0500 [thread overview]
Message-ID: <55F2E0D0.6050001@windriver.com> (raw)
In-Reply-To: <1535067091.320761431926242042.JavaMail.weblogic@ep2mlwas03d>
Merged to the staging branch.
On 5/18/15 12:17 AM, Maninder Singh wrote:
> EP-F6AA0618C49C4AEDA73BFF1B39950BAB
> Hi,
>
> Subject: [PATCH 1/1] LD_PRELOAD Implementation in Prelink
>
> prelink fails if there are ld_preload libs present at target with below error.
> expect libsX.so.1, found /lib/libY.so in dependency order
> where libY.so.1 is ld_preload lib
>
> To use this feature :
> ./prelink --ld-preload=libpreload1.so:libpreload2.so:.... upto 20 libs
> Order of libraries to be preloaded is significant. Make sure sequence
> mentioned in prelink
> should be same as runtime sequence.
>
> Signed-off-by: Vaneet Narang <v.narang@samsung.com>
> Signed-off-by: Maninder Singh <maninder1.s@samsung.com>
> Reviewed-by: Ajeet Yadav <ajeet.v@samsung.com>
> Reviewed-by: Geon-ho Kim <gh007.kim@samsung.com>
> ---
> src/gather.c | 8 +++++++-
> src/get.c | 9 ++++++++-
> src/main.c | 6 ++++++
> src/prelink.h | 1 +
> src/rtld/rtld.c | 51 +++++++++++++++++++++++++++++++++++++++++++++------
> 5 files changed, 67 insertions(+), 8 deletions(-)
>
> diff --git a/src/gather.c b/src/gather.c
> index c3d3128..5ccd243 100644
> --- a/src/gather.c
> +++ b/src/gather.c
> @@ -61,7 +61,7 @@ gather_deps (DSO *dso, struct prelink_entry *ent)
> {
> int i, j, seen = 0;
> FILE *f = NULL;
> - const char *argv[6];
> + const char *argv[8];
> const char *envp[5];
> char *line = NULL, *p, *q = NULL;
> const char **depends = NULL;
> @@ -74,6 +74,7 @@ gather_deps (DSO *dso, struct prelink_entry *ent)
> int nliblist = 0;
> const char *dl;
> const char *ent_filename;
> + int etype = dso->ehdr.e_type;
>
> if (check_dso (dso))
> {
> @@ -181,6 +182,11 @@ gather_deps (DSO *dso, struct prelink_entry *ent)
> argv[i++] = "--library-path";
> argv[i++] = ld_library_path;
> }
> +
> + if(etype == ET_EXEC && ld_preload) {
> + argv[i++] = "--ld-preload";
> + argv[i++] = ld_preload;
> + }
> argv[i++] = "--target-paths";
> argv[i++] = ent_filename;
> argv[i] = NULL;
> diff --git a/src/get.c b/src/get.c
> index 6a63f02..043af22 100644
> --- a/src/get.c
> +++ b/src/get.c
> @@ -641,12 +641,13 @@ prelink_get_relocations (struct prelink_info *info)
> {
> FILE *f;
> DSO *dso = info->dso;
> - const char *argv[6];
> + const char *argv[8];
> const char *envp[4];
> int i, ret, status;
> char *p;
> const char *dl = dynamic_linker ?: dso->arch->dynamic_linker;
> const char *ent_filename;
> + int etype = info->dso->ehdr.e_type;
>
> if (info->ent->type == ET_DYN)
> {
> @@ -709,6 +710,12 @@ prelink_get_relocations (struct prelink_info *info)
> argv[i++] = "--library-path";
> argv[i++] = ld_library_path;
> }
> +
> + if(etype == ET_EXEC && ld_preload) {
> + argv[i++] = "--ld-preload";
> + argv[i++] = ld_preload;
> + }
> +
> argv[i++] = "--target-paths";
> argv[i++] = ent_filename;
> argv[i] = NULL;
> diff --git a/src/main.c b/src/main.c
> index 15c1d53..a99816d 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -59,6 +59,7 @@ const char *ld_library_path;
> const char *prelink_conf = PRELINK_CONF;
> const char *prelink_cache = PRELINK_CACHE;
> const char *undo_output;
> +char *ld_preload = NULL;
> int noreexecinit;
> time_t initctime;
>
> @@ -84,6 +85,7 @@ static char argp_doc[] = PRELINK_PROG " -- program to relocate and prelink ELF s
> #define OPT_SYSROOT 0x8d
> #define OPT_RTLD 0x8e
> #define OPT_ALLOW_TEXTREL 0x8f
> +#define OPT_LD_PRELOAD 0x90
>
> static struct argp_option options[] = {
> {"all", 'a', 0, 0, "Prelink all binaries" },
> @@ -123,6 +125,7 @@ static struct argp_option options[] = {
> {"rtld", OPT_RTLD, "RTLD", OPTION_HIDDEN, "" },
> {"init", 'i', 0, 0, "Do not re-execute init" },
> {"allow-textrel", OPT_ALLOW_TEXTREL, 0, 0, "Allow text relocations even on architectures where they may not work" },
> + {"ld-preload", OPT_LD_PRELOAD, "LIBLIST", 0, "List of libraries preloaded on target" },
> { 0 }
> };
>
> @@ -250,6 +253,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
> case OPT_ALLOW_TEXTREL:
> allow_bad_textrel = 1;
> break;
> + case OPT_LD_PRELOAD:
> + ld_preload = arg;
> + break;
> default:
> return ARGP_ERR_UNKNOWN;
> }
> diff --git a/src/prelink.h b/src/prelink.h
> index 66aba99..a6ce607 100644
> --- a/src/prelink.h
> +++ b/src/prelink.h
> @@ -597,6 +597,7 @@ extern enum verify_method_t verify_method;
> extern int quick;
> extern long long seed;
> extern GElf_Addr mmap_reg_start, mmap_reg_end, layout_page_size;
> +extern char *ld_preload;
>
> extern const char *sysroot;
>
> diff --git a/src/rtld/rtld.c b/src/rtld/rtld.c
> index 2ad3ade..f014bea 100644
> --- a/src/rtld/rtld.c
> +++ b/src/rtld/rtld.c
> @@ -47,6 +47,7 @@ unsigned int _dl_debug_mask = 0;
> /* LD_DYNAMIC_WEAK option. Default is off, changing to 1
> is equivalent to setting LD_DYNAMIC_WEAK. */
> unsigned int _dl_dynamic_weak = 0;
> +#define MAX_PRELOADED_LIBS 20
>
> struct search_path
> {
> @@ -60,6 +61,7 @@ int host_paths;
> char * dst_ORIGIN;
> char * dst_PLATFORM = ""; /* undefined */
> char * dst_LIB = "lib";
> +char * ld_preload = NULL;
>
>
> void string_to_path (struct search_path *path, const char *string);
> @@ -73,11 +75,13 @@ static char argp_doc[] = PRELINK_RTLD_PROG " -- program to simulate the runtime
> #define OPT_SYSROOT 0x8c
> #define OPT_LIBRARY_PATH 0x8e
> #define OPT_TARGET_PATHS 0x8f
> +#define OPT_LD_PRELOAD 0x90
>
> static struct argp_option options[] = {
> {"library-path", OPT_LIBRARY_PATH, "LIBRARY_PATH", 0, "Set library search path to LIBRARY_PATH" },
> {"root", OPT_SYSROOT, "ROOT_PATH", 0, "Prefix all paths with ROOT_PATH" },
> {"target-paths", OPT_TARGET_PATHS, 0, 0, "Specified paths are based on ROOT_PATH" },
> + {"ld-preload", OPT_LD_PRELOAD, "LIBLIST", 0, "List of libraries needs to be preloaded"},
> { 0 }
> };
>
> @@ -95,6 +99,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
> case OPT_TARGET_PATHS:
> host_paths = 0;
> break;
> + case OPT_LD_PRELOAD:
> + ld_preload = arg;
> + break;
> default:
> return ARGP_ERR_UNKNOWN;
> }
> @@ -582,6 +589,8 @@ load_dsos (DSO *dso, int host_paths)
> {
> struct dso_list *dso_list, *dso_list_tail, *cur_dso_ent, *new_dso_ent;
> struct stat64 st;
> + int total_preload = 0;
> + char * libname[MAX_PRELOADED_LIBS] = {NULL};
>
> /* Assume it's static unless we find DT_NEEDED entries */
> static_binary = 1;
> @@ -604,6 +613,22 @@ load_dsos (DSO *dso, int host_paths)
>
> cur_dso_ent = dso_list_tail = dso_list;
>
> + if(dso->ehdr.e_type == ET_EXEC && ld_preload) {
> + char *next_lib = ld_preload;
> + libname[total_preload] = ld_preload;
> + total_preload++;
> + next_lib=strchr(ld_preload,':');
> + while(next_lib!=NULL){
> + *next_lib = '\0';
> + next_lib++;
> + libname[total_preload] = next_lib;
> + total_preload++;
> + next_lib=strchr(next_lib,':');
> + }
> + }
> + else {
> + total_preload = 0;
> + }
> while (cur_dso_ent != NULL)
> {
> DSO *cur_dso, *new_dso;
> @@ -624,9 +649,16 @@ load_dsos (DSO *dso, int host_paths)
> {
> int ndx, maxndx;
> maxndx = data->d_size / cur_dso->shdr[cur_dso->dynamic].sh_entsize;
> - for (ndx = 0; ndx < maxndx; ++ndx)
> + for (ndx = 0; ndx < maxndx + total_preload; ++ndx)
> {
> - gelfx_getdyn (cur_dso->elf, data, ndx, &dyn);
> +
> + if(ndx - total_preload >= 0) {
> + gelfx_getdyn (cur_dso->elf, data, ndx - total_preload, &dyn);
> + }
> + else {
> + dyn.d_tag = DT_NEEDED;
> + }
> +
> if (dyn.d_tag == DT_NULL)
> break;
> if (dyn.d_tag == DT_NEEDED)
> @@ -635,10 +667,17 @@ load_dsos (DSO *dso, int host_paths)
> static_binary = 0;
>
> char *new_name=NULL, *new_canon_name=NULL;
> - const char *soname = get_data (cur_dso,
> - cur_dso->info[DT_STRTAB]
> - + dyn.d_un.d_val,
> - NULL, NULL);
> + char * soname = NULL;
> + if(ndx - total_preload >= 0) {
> + soname = get_data (cur_dso,
> + cur_dso->info[DT_STRTAB]
> + + dyn.d_un.d_val,
> + NULL, NULL);
> + }
> + else {
> + soname = libname[ndx];
> + }
> +
> new_dso_ent = in_dso_list (dso_list, soname, NULL);
> if (new_dso_ent == NULL)
> {
>
prev parent reply other threads:[~2015-09-11 14:10 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-18 5:17 [EDT][prelink-cross] LD_PRELOAD Implementation in Prelink Maninder Singh
2015-09-11 14:10 ` Mark Hatle [this message]
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=55F2E0D0.6050001@windriver.com \
--to=mark.hatle@windriver.com \
--cc=ajeet.y@samsung.com \
--cc=maninder1.s@samsung.com \
--cc=v.narang@samsung.com \
--cc=yocto@yoctoproject.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.