From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27642 invoked by alias); 1 Mar 2005 22:27:14 -0000 Mailing-List: contact java-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: java-prs-owner@gcc.gnu.org Received: (qmail 27588 invoked by alias); 1 Mar 2005 22:27:10 -0000 Date: Wed, 02 Mar 2005 00:11:00 -0000 Message-ID: <20050301222710.27587.qmail@sourceware.org> From: "aoliva at redhat dot com" To: java-prs@gcc.gnu.org In-Reply-To: <20050223105204.20160.rearnsha@gcc.gnu.org> References: <20050223105204.20160.rearnsha@gcc.gnu.org> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug libgcj/20160] [4.0/4.1 Regression] link errors building libgcj tests X-Bugzilla-Reason: CC X-SW-Source: 2005-q1/txt/msg00551.txt.bz2 List-Id: ------- Additional Comments From aoliva at gcc dot gnu dot org 2005-03-01 22:27 ------- Subject: [PR libgcj/20160] rename archive members with duplicate basenames The archives created for libjava are broken, in that some of the object files that should go into it are missing. That's because AR is supposed to drop dirname components of pathnames in archive members. Libtool was already careful enough to ensure the all archive members made to the convenience library, by using ar cq if creating archives piecewise, but it isn't as careful when extracting the archive members to create other archives with them, so we end up dropping all but the last-added overlapping-basename object from the second-generation archive. This problem is already fixed in libtool mainline and 1.5 branches, using some clever tricks at extract time, that I'm not entirely comfortable with, and not quite willing to back-port. Until we actually upgrade to a newer libtool, I'd rather go with this change that is IMHO safer, but unfortunately introduces some additional overhead in archive creation time. Oh well... I'm checking this in mainline and 4.0 branch. Tested on arm-elf (thanks Richard!) and x86_64-linux-gnu. Index: ChangeLog from Alexandre Oliva PR libgcj/20160 * ltmain.sh: Avoid creating archives with components that have duplicate basenames. * libjava/configure: Rebuilt. Index: ltmain.sh =================================================================== RCS file: /cvs/gcc/gcc/ltmain.sh,v retrieving revision 1.24 diff -u -p -r1.24 ltmain.sh --- ltmain.sh 8 Sep 2004 15:43:46 -0000 1.24 +++ ltmain.sh 1 Mar 2005 22:16:48 -0000 @@ -4307,6 +4307,63 @@ fi\ # fi # done + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && @@ -4320,20 +4377,7 @@ fi\ objlist= concat_cmds= save_oldobjs=$oldobjs - # GNU ar 2.10+ was changed to match POSIX; thus no paths are - # encoded into archives. This makes 'ar r' malfunction in - # this piecewise linking case whenever conflicting object - # names appear in distinct ar calls; check, warn and compensate. - if (for obj in $save_oldobjs - do - $echo "X$obj" | $Xsed -e 's%^.*/%%' - done | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 - $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 - AR_FLAGS=cq - fi + for obj in $save_oldobjs do oldobjs="$objlist $obj" -- Alexandre Oliva http://www.ic.unicamp.br/~oliva/ Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org} Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org} -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20160