diff options
author | Paul Pluzhnikov <ppluzhnikov@google.com> | 2014-03-12 15:58:39 -0700 |
---|---|---|
committer | Paul Pluzhnikov <ppluzhnikov@google.com> | 2014-03-12 15:58:39 -0700 |
commit | 798212a01311491d5e14fcda687460b75f8ca286 (patch) | |
tree | 97d78fbe6bd1a25dd6f1d181ae3a0efc90479d52 /elf | |
parent | abe6d90cc8c1c212dab7cde4468f9ed895d6ba86 (diff) | |
download | glibc-798212a01311491d5e14fcda687460b75f8ca286.tar.gz glibc-798212a01311491d5e14fcda687460b75f8ca286.tar.xz glibc-798212a01311491d5e14fcda687460b75f8ca286.zip |
2014-03-12 Paul Pluzhnikov <ppluzhnikov@google.com>
[BZ #16381] * elf/Makefile (tests): Add tst-pie2. (tests-pie): Add tst-pie2. * elf/tst-pie2.c: New file. * elf/dl-load.c (_dl_map_object_from_fd): Assert correct l_type for ET_EXEC. * elf/rtld.c (map_doit): Load executable as lt_executable. (dl_main): Likewise.
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 5 | ||||
-rw-r--r-- | elf/dl-load.c | 4 | ||||
-rw-r--r-- | elf/rtld.c | 5 |
3 files changed, 8 insertions, 6 deletions
diff --git a/elf/Makefile b/elf/Makefile index e31ab920e3..2db3c980da 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -215,8 +215,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ tst-array5dep tst-null-argv-lib ifeq (yesyes,$(have-fpie)$(build-shared)) modules-names += tst-piemod1 -tests += tst-pie1 -tests-pie += tst-pie1 +tests += tst-pie1 tst-pie2 +tests-pie += tst-pie1 tst-pie2 endif modules-execstack-yes = tst-execstack-mod extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) @@ -901,6 +901,7 @@ $(objpfx)tst-array5-static-cmp.out: tst-array5-static.exp \ $(evaluate-test) CFLAGS-tst-pie1.c += $(pie-ccflag) +CFLAGS-tst-pie2.c += $(pie-ccflag) $(objpfx)tst-pie1: $(objpfx)tst-piemod1.so diff --git a/elf/dl-load.c b/elf/dl-load.c index 6501ff2dca..8ebc1285ea 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1534,8 +1534,8 @@ cannot enable executable stack as shared object requires"); /* Signal that we closed the file. */ fd = -1; - if (l->l_type == lt_library && type == ET_EXEC) - l->l_type = lt_executable; + /* If this is ET_EXEC, we should have loaded it as lt_executable. */ + assert (type != ET_EXEC || l->l_type == lt_executable); l->l_entry += l->l_addr; diff --git a/elf/rtld.c b/elf/rtld.c index 7f1413af08..63e92d3006 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -623,7 +623,8 @@ static void map_doit (void *a) { struct map_args *args = (struct map_args *) a; - args->map = _dl_map_object (args->loader, args->str, lt_library, 0, + int type = (args->mode == __RTLD_OPENEXEC) ? lt_executable : lt_library; + args->map = _dl_map_object (args->loader, args->str, type, 0, args->mode, LM_ID_BASE); } @@ -1075,7 +1076,7 @@ of this helper program; chances are you did not intend to run this program.\n\ else { HP_TIMING_NOW (start); - _dl_map_object (NULL, rtld_progname, lt_library, 0, + _dl_map_object (NULL, rtld_progname, lt_executable, 0, __RTLD_OPENEXEC, LM_ID_BASE); HP_TIMING_NOW (stop); |