From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11526 invoked by alias); 15 Jul 2004 12:48:47 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 11493 invoked from network); 15 Jul 2004 12:48:46 -0000 Received: from unknown (HELO sunsite.ms.mff.cuni.cz) (195.113.15.26) by sourceware.org with SMTP; 15 Jul 2004 12:48:46 -0000 Received: from sunsite.ms.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8) with ESMTP id i6FAX43j015181; Thu, 15 Jul 2004 12:33:04 +0200 Received: (from jakub@localhost) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8/Submit) id i6FAX4bq015179; Thu, 15 Jul 2004 12:33:04 +0200 Date: Thu, 15 Jul 2004 12:48:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Allow main to come from a shared library for PIE [BZ #262] Message-ID: <20040715103304.GA30497@sunsite.ms.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-SW-Source: 2004-07/txt/msg00031.txt.bz2 Hi! 2004-07-15 Jakub Jelinek [BZ #262] * sysdeps/i386/elf/start.S (_start): Use @GOT instead of @GOTOFF for main. Patch by Solar Designer . * elf/Makefile: Add rules to build and run tst-pie1. * elf/tst-pie1.c: New test. * elf/tst-piemod1.c: New file. --- libc/sysdeps/i386/elf/start.S.jj 2004-07-15 14:41:46.000000000 +0200 +++ libc/sysdeps/i386/elf/start.S 2004-07-15 14:42:37.000000000 +0200 @@ -1,5 +1,6 @@ /* Startup code compliant to the ELF i386 ABI. - Copyright (C) 1995-1998,2000,2001,2002,2003 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -81,8 +82,7 @@ _start: pushl %ecx /* Push second argument: argv. */ pushl %esi /* Push first argument: argc. */ - leal BP_SYM (main)@GOTOFF(%ebx), %eax - pushl %eax + pushl BP_SYM (main)@GOT(%ebx) /* Call the user's main function, and exit with its value. But let the libc call main. */ --- libc/elf/tst-pie1.c.jj 2004-07-15 14:37:41.000000000 +0200 +++ libc/elf/tst-pie1.c 2004-07-15 14:37:41.000000000 +0200 @@ -0,0 +1,5 @@ +int +foo (void) +{ + return 34; +} --- libc/elf/Makefile.jj 2004-06-17 17:08:46.000000000 +0200 +++ libc/elf/Makefile 2004-07-15 14:47:43.000000000 +0200 @@ -80,7 +80,7 @@ distribute := rtld-Rules \ nodel2mod1.c nodel2mod2.c nodel2mod3.c \ reldep9.c reldep9mod1.c reldep9mod2.c reldep9mod3.c \ tst-array1.exp tst-array2.exp tst-array4.exp \ - tst-array2dep.c \ + tst-array2dep.c tst-piemod1.c \ tst-execstack-mod.c tst-dlmodcount.c \ check-textrel.c dl-sysdep.h @@ -160,6 +160,9 @@ tests-nodelete-yes = nodelete nodelete2 tests-nodlopen-yes = nodlopen nodlopen2 tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog endif +ifeq (yesyes,$(have-fpie)$(build-shared)) +tests: $(objpfx)tst-pie1.out +endif modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ testobj1_1 failobj constload2 constload3 unloadmod \ dep1 dep2 dep3 dep4 $(modules-vis-$(have-protected)) \ @@ -185,6 +188,9 @@ modules-names = testobj1 testobj2 testob ifeq (yes,$(have-initfini-array)) modules-names += tst-array2dep endif +ifeq (yesyes,$(have-fpie)$(build-shared)) +modules-names += tst-piemod1 +endif modules-vis-yes = vismod1 vismod2 vismod3 modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4 \ nodel2mod1 nodel2mod2 nodel2mod3 @@ -705,6 +711,25 @@ $(objpfx)tst-array4.out: $(objpfx)tst-ar $< > $@ cmp $@ tst-array4.exp > /dev/null +ifeq (yesyes,$(have-fpie)$(build-shared)) +CFLAGS-tst-pie1.c += -fpie + +$(objpfx)tst-pie1.out: $(objpfx)tst-pie1 + $(elf-objpfx)$(rtld-installed-name) \ + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ + $< > $@ + +$(objpfx)tst-pie1: $(objpfx)tst-pie1.o $(objpfx)tst-piemod1.so + $(LINK.o) -pie -Wl,-O1 \ + $(sysdep-LDFLAGS) $(config-LDFLAGS) \ + $(extra-B-$(@F:lib%.so=%).so) -B$(csu-objpfx) \ + $(extra-B-$(@F:lib%.so=%).so) $(load-map-file) \ + $(LDFLAGS) $(LDFLAGS-$(@F)) \ + -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \ + -o $@ $(objpfx)tst-pie1.o $(objpfx)tst-piemod1.so \ + $(common-objpfx)libc_nonshared.a +endif + check-textrel-CFLAGS = -O -Wall -D_XOPEN_SOURCE=600 -D_BSD_SOURCE $(objpfx)check-textrel: check-textrel.c $(native-compile) --- libc/elf/tst-piemod1.c.jj 2004-07-15 14:37:41.000000000 +0200 +++ libc/elf/tst-piemod1.c 2004-07-15 14:37:41.000000000 +0200 @@ -0,0 +1,20 @@ +#include + +int +foo (void) +{ + return 21; +} + +int +main (void) +{ + int val = foo (); + if (val != 34) + { + printf ("foo () returned %d\n", val); + return 1; + } + + return 0; +} Jakub