------- 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 <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED], gcc.gnu.org} Free Software Evangelist [EMAIL PROTECTED], gnu.org} -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20160