diff mbox series

configure: arrange to use appropriate objcopy

Message ID 0fddf82b-750a-67b8-028e-ba0a71a35cf6@suse.com
State New
Headers show
Series configure: arrange to use appropriate objcopy | expand

Commit Message

Jan Beulich June 2, 2022, 3:32 p.m. UTC
Using the system objcopy is wrong when other configure checks have
probed a different set of binutils (I've noticed the problem on a system
where the base objcopy can't deal with compressed debug sections).
Arrange for the matching one to be picked up, first and foremost if an
"in tree" one is available, by mirroring respective logic already
present for nm.

gcc/

	* Makefile.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
	* configure.ac: Check for objcopy, producing
	ORIGINAL_OBJCOPY_FOR_TARGET.
	* configure: Update accordingly.
	* exec-tool.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
	Handle objcopy.

Comments

Alexandre Oliva June 3, 2022, 6:44 a.m. UTC | #1
On Jun  2, 2022, Jan Beulich via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:

> 	* Makefile.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
> 	* configure.ac: Check for objcopy, producing
> 	ORIGINAL_OBJCOPY_FOR_TARGET.
> 	* configure: Update accordingly.
> 	* exec-tool.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
> 	Handle objcopy.

Ok, thanks
Jakub Jelinek June 4, 2022, 8:32 a.m. UTC | #2
On Thu, Jun 02, 2022 at 05:32:10PM +0200, Jan Beulich via Gcc-patches wrote:
> Using the system objcopy is wrong when other configure checks have
> probed a different set of binutils (I've noticed the problem on a system
> where the base objcopy can't deal with compressed debug sections).
> Arrange for the matching one to be picked up, first and foremost if an
> "in tree" one is available, by mirroring respective logic already
> present for nm.
> 
> gcc/
> 
> 	* Makefile.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
> 	* configure.ac: Check for objcopy, producing
> 	ORIGINAL_OBJCOPY_FOR_TARGET.
> 	* configure: Update accordingly.
> 	* exec-tool.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
> 	Handle objcopy.

This regressed
Executing on host: /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/     -fdiagnostics-plain-output   -flto -g -gsplit-dwarf   -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c    (timeout = 300)
spawn -ignore SIGHUP /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/ -fdiagnostics-plain-output -flto -g -gsplit-dwarf -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c
cc1: note: '-gsplit-dwarf' is not supported with LTO, disabling
/home/jakub/src/gcc/obj44/gcc/objcopy: line 120: exec: --: invalid option
exec: usage: exec [-cl] [-a name] [command [argument ...]] [redirection ...]
compiler exited with status 1
FAIL: gcc.dg/lto/pr83719 c_lto_pr83719_0.o assemble,  -flto -g -gsplit-dwarf 
for me, both on x86_64-linux and i686-linux.
For some reason, I have
grep OBJCOPY *gcc/Makefile
gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
prev-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
stage1-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 

	Jakub
Jan Beulich June 7, 2022, 6:12 a.m. UTC | #3
On 04.06.2022 10:32, Jakub Jelinek wrote:
> On Thu, Jun 02, 2022 at 05:32:10PM +0200, Jan Beulich via Gcc-patches wrote:
>> Using the system objcopy is wrong when other configure checks have
>> probed a different set of binutils (I've noticed the problem on a system
>> where the base objcopy can't deal with compressed debug sections).
>> Arrange for the matching one to be picked up, first and foremost if an
>> "in tree" one is available, by mirroring respective logic already
>> present for nm.
>>
>> gcc/
>>
>> 	* Makefile.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
>> 	* configure.ac: Check for objcopy, producing
>> 	ORIGINAL_OBJCOPY_FOR_TARGET.
>> 	* configure: Update accordingly.
>> 	* exec-tool.in (ORIGINAL_OBJCOPY_FOR_TARGET): New.
>> 	Handle objcopy.
> 
> This regressed
> Executing on host: /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/     -fdiagnostics-plain-output   -flto -g -gsplit-dwarf   -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c    (timeout = 300)
> spawn -ignore SIGHUP /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/ -fdiagnostics-plain-output -flto -g -gsplit-dwarf -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c
> cc1: note: '-gsplit-dwarf' is not supported with LTO, disabling
> /home/jakub/src/gcc/obj44/gcc/objcopy: line 120: exec: --: invalid option
> exec: usage: exec [-cl] [-a name] [command [argument ...]] [redirection ...]
> compiler exited with status 1
> FAIL: gcc.dg/lto/pr83719 c_lto_pr83719_0.o assemble,  -flto -g -gsplit-dwarf 
> for me, both on x86_64-linux and i686-linux.

Hmm, it surely worked for me for both, with and without in-tree binutils
(you don't say which variant you saw the failure with).

> For some reason, I have
> grep OBJCOPY *gcc/Makefile
> gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
> prev-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
> stage1-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 

What about the corresponding ORIGINAL_NM_FOR_TARGET? And could you provide
one of the config.log instances? 

Jan
Jakub Jelinek June 7, 2022, 7:41 a.m. UTC | #4
On Tue, Jun 07, 2022 at 08:12:26AM +0200, Jan Beulich via Gcc-patches wrote:
> > This regressed
> > Executing on host: /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/     -fdiagnostics-plain-output   -flto -g -gsplit-dwarf   -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c    (timeout = 300)
> > spawn -ignore SIGHUP /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/ -fdiagnostics-plain-output -flto -g -gsplit-dwarf -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c
> > cc1: note: '-gsplit-dwarf' is not supported with LTO, disabling
> > /home/jakub/src/gcc/obj44/gcc/objcopy: line 120: exec: --: invalid option
> > exec: usage: exec [-cl] [-a name] [command [argument ...]] [redirection ...]
> > compiler exited with status 1
> > FAIL: gcc.dg/lto/pr83719 c_lto_pr83719_0.o assemble,  -flto -g -gsplit-dwarf 
> > for me, both on x86_64-linux and i686-linux.
> 
> Hmm, it surely worked for me for both, with and without in-tree binutils
> (you don't say which variant you saw the failure with).

System binutils.
grep ORIGINAL_ gcc/Makefile 
ORIGINAL_AS_FOR_TARGET = /usr/bin/as
ORIGINAL_LD_FOR_TARGET = /usr/bin/ld
ORIGINAL_NM_FOR_TARGET = /usr/bin/nm
ORIGINAL_OBJCOPY_FOR_TARGET = 
ls -l /usr/bin/{as,ld,nm,objcopy}
-rwxr-xr-x. 1 root root 439192 Mar 10 12:51 /usr/bin/as
lrwxrwxrwx. 1 root root     20 May 20 13:28 /usr/bin/ld -> /etc/alternatives/ld
-rwxr-xr-x. 1 root root  47928 Mar 10 12:51 /usr/bin/nm
-rwxr-xr-x. 1 root root 184304 Mar 10 12:51 /usr/bin/objcopy
(but ditto grep ORIGINAL_ stage1-gcc/Makefile
or grep ORIGINAL_ prev-gcc/Makefile).

> > For some reason, I have
> > grep OBJCOPY *gcc/Makefile
> > gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
> > prev-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
> > stage1-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
> 
> What about the corresponding ORIGINAL_NM_FOR_TARGET? And could you provide
> one of the config.log instances? 

config.log has:
configure:23317: checking what linker to use
configure:23351: result: /usr/bin/ld
configure:23379: checking for nm
configure:23397: found /usr/bin/nm
configure:23409: result: /usr/bin/nm
configure:23420: checking what nm to use
configure:23428: result: /usr/bin/nm
configure:23498: checking what objcopy to use
configure:23506: result:
configure:23536: checking for objdump
configure:23554: found /usr/bin/objdump
configure:23566: result: /usr/bin/objdump
configure:23577: checking what objdump to use
configure:23587: result: /usr/bin/objdump

It is a bootstrapped compiler:
../configure --enable-languages=default,obj-c++,lto,go,d --enable-checking=yes,rtl,extra --enable-libstdcxx-backtrace=yes && make -j32 bootstrap > LOG 2>&1
on Fedora 36 x86_64-linux (ada left out because it is currently broken).

Comparing the toplevel Makefile, I see some differences:
grep NM_FOR_TARGET Makefile 
	NM_FOR_TARGET="$(NM_FOR_TARGET)"; export NM_FOR_TARGET; \
	NM="$(COMPILER_NM_FOR_TARGET)"; export NM; \
NM_FOR_TARGET=$(NM)
COMPILER_NM_FOR_TARGET=$$r/$(HOST_SUBDIR)/gcc/nm
	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
	'NM=$(COMPILER_NM_FOR_TARGET)' \
grep OBJCOPY_FOR_TARGET Makefile 
	OBJCOPY_FOR_TARGET="$(OBJCOPY_FOR_TARGET)"; export OBJCOPY_FOR_TARGET; \
	OBJCOPY="$(OBJCOPY_FOR_TARGET)"; export OBJCOPY; \
OBJCOPY_FOR_TARGET=$(OBJCOPY)
	"OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET)" \
	'OBJCOPY=$$(OBJCOPY_FOR_TARGET)' \
E.g. the COMPILER_*_FOR_TARGET line is missing completely for OBJCOPY
and the last line is different too.
Also:
grep ^NM[[:space:]]*= Makefile; echo end
NM = nm
end
grep ^OBJCOPY[[:space:]]*= Makefile; echo end
end

Note, I see
S["OBJDUMP"]="objdump"
S["OBJCOPY"]="objcopy"
S["WINDMC"]="windmc"
S["WINDRES"]="windres"
S["STRIP"]="strip"
S["RANLIB"]="ranlib"
S["NM"]="nm"
in toplevel status, it is just that toplevel:
grep ^NM Makefile.tpl 
NM_FOR_BUILD = @NM_FOR_BUILD@
NM = @NM@
NM_FOR_TARGET=@NM_FOR_TARGET@
grep ^OBJCOPY Makefile.tpl 
OBJCOPY_FOR_TARGET=@OBJCOPY_FOR_TARGET@
doesn't have the OBJCOPY = @OBJCOPY@ line, and perhaps the
COMPILER_OBJCOPY_FOR_TARGET stuff.

	Jakub
Jan Beulich June 7, 2022, 8:13 a.m. UTC | #5
On 07.06.2022 09:41, Jakub Jelinek wrote:
> On Tue, Jun 07, 2022 at 08:12:26AM +0200, Jan Beulich via Gcc-patches wrote:
>>> This regressed
>>> Executing on host: /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/     -fdiagnostics-plain-output   -flto -g -gsplit-dwarf   -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c    (timeout = 300)
>>> spawn -ignore SIGHUP /home/jakub/src/gcc/obj44/gcc/xgcc -B/home/jakub/src/gcc/obj44/gcc/ -fdiagnostics-plain-output -flto -g -gsplit-dwarf -c -o c_lto_pr83719_0.o /home/jakub/src/gcc/gcc/testsuite/gcc.dg/lto/pr83719_0.c
>>> cc1: note: '-gsplit-dwarf' is not supported with LTO, disabling
>>> /home/jakub/src/gcc/obj44/gcc/objcopy: line 120: exec: --: invalid option
>>> exec: usage: exec [-cl] [-a name] [command [argument ...]] [redirection ...]
>>> compiler exited with status 1
>>> FAIL: gcc.dg/lto/pr83719 c_lto_pr83719_0.o assemble,  -flto -g -gsplit-dwarf 
>>> for me, both on x86_64-linux and i686-linux.
>>
>> Hmm, it surely worked for me for both, with and without in-tree binutils
>> (you don't say which variant you saw the failure with).
> 
> System binutils.
> grep ORIGINAL_ gcc/Makefile 
> ORIGINAL_AS_FOR_TARGET = /usr/bin/as
> ORIGINAL_LD_FOR_TARGET = /usr/bin/ld
> ORIGINAL_NM_FOR_TARGET = /usr/bin/nm
> ORIGINAL_OBJCOPY_FOR_TARGET = 
> ls -l /usr/bin/{as,ld,nm,objcopy}
> -rwxr-xr-x. 1 root root 439192 Mar 10 12:51 /usr/bin/as
> lrwxrwxrwx. 1 root root     20 May 20 13:28 /usr/bin/ld -> /etc/alternatives/ld
> -rwxr-xr-x. 1 root root  47928 Mar 10 12:51 /usr/bin/nm
> -rwxr-xr-x. 1 root root 184304 Mar 10 12:51 /usr/bin/objcopy
> (but ditto grep ORIGINAL_ stage1-gcc/Makefile
> or grep ORIGINAL_ prev-gcc/Makefile).
> 
>>> For some reason, I have
>>> grep OBJCOPY *gcc/Makefile
>>> gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
>>> prev-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
>>> stage1-gcc/Makefile:ORIGINAL_OBJCOPY_FOR_TARGET = 
>>
>> What about the corresponding ORIGINAL_NM_FOR_TARGET? And could you provide
>> one of the config.log instances? 
> 
> config.log has:
> configure:23317: checking what linker to use
> configure:23351: result: /usr/bin/ld
> configure:23379: checking for nm
> configure:23397: found /usr/bin/nm
> configure:23409: result: /usr/bin/nm
> configure:23420: checking what nm to use
> configure:23428: result: /usr/bin/nm
> configure:23498: checking what objcopy to use
> configure:23506: result:
> configure:23536: checking for objdump
> configure:23554: found /usr/bin/objdump
> configure:23566: result: /usr/bin/objdump
> configure:23577: checking what objdump to use
> configure:23587: result: /usr/bin/objdump
> 
> It is a bootstrapped compiler:
> ../configure --enable-languages=default,obj-c++,lto,go,d --enable-checking=yes,rtl,extra --enable-libstdcxx-backtrace=yes && make -j32 bootstrap > LOG 2>&1
> on Fedora 36 x86_64-linux (ada left out because it is currently broken).
> 
> Comparing the toplevel Makefile, I see some differences:
> grep NM_FOR_TARGET Makefile 
> 	NM_FOR_TARGET="$(NM_FOR_TARGET)"; export NM_FOR_TARGET; \
> 	NM="$(COMPILER_NM_FOR_TARGET)"; export NM; \
> NM_FOR_TARGET=$(NM)
> COMPILER_NM_FOR_TARGET=$$r/$(HOST_SUBDIR)/gcc/nm
> 	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
> 	'NM=$(COMPILER_NM_FOR_TARGET)' \
> grep OBJCOPY_FOR_TARGET Makefile 
> 	OBJCOPY_FOR_TARGET="$(OBJCOPY_FOR_TARGET)"; export OBJCOPY_FOR_TARGET; \
> 	OBJCOPY="$(OBJCOPY_FOR_TARGET)"; export OBJCOPY; \
> OBJCOPY_FOR_TARGET=$(OBJCOPY)
> 	"OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET)" \
> 	'OBJCOPY=$$(OBJCOPY_FOR_TARGET)' \
> E.g. the COMPILER_*_FOR_TARGET line is missing completely for OBJCOPY
> and the last line is different too.
> Also:
> grep ^NM[[:space:]]*= Makefile; echo end
> NM = nm
> end
> grep ^OBJCOPY[[:space:]]*= Makefile; echo end
> end
> 
> Note, I see
> S["OBJDUMP"]="objdump"
> S["OBJCOPY"]="objcopy"
> S["WINDMC"]="windmc"
> S["WINDRES"]="windres"
> S["STRIP"]="strip"
> S["RANLIB"]="ranlib"
> S["NM"]="nm"
> in toplevel status, it is just that toplevel:
> grep ^NM Makefile.tpl 
> NM_FOR_BUILD = @NM_FOR_BUILD@
> NM = @NM@
> NM_FOR_TARGET=@NM_FOR_TARGET@
> grep ^OBJCOPY Makefile.tpl 
> OBJCOPY_FOR_TARGET=@OBJCOPY_FOR_TARGET@
> doesn't have the OBJCOPY = @OBJCOPY@ line, and perhaps the
> COMPILER_OBJCOPY_FOR_TARGET stuff.

Let me revert the change - I've just realized that I only thought I would
have tested this with system binutils as well. I'm sorry for the breakage.

Jan
diff mbox series

Patch

--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -499,6 +499,7 @@  RANLIB_FOR_TARGET := $(shell \
 ORIGINAL_LD_FOR_TARGET = @ORIGINAL_LD_FOR_TARGET@
 ORIGINAL_NM_FOR_TARGET = @ORIGINAL_NM_FOR_TARGET@
 NM_FOR_TARGET = ./nm
+ORIGINAL_OBJCOPY_FOR_TARGET = @ORIGINAL_OBJCOPY_FOR_TARGET@
 STRIP_FOR_TARGET := $(shell \
   if [ -f $(objdir)/../binutils/strip-new ] ; then \
     echo $(objdir)/../binutils/strip-new ; \
--- a/gcc/configure
+++ b/gcc/configure
@@ -733,6 +733,8 @@  gcc_cv_readelf
 gcc_cv_objdump
 ORIGINAL_NM_FOR_TARGET
 gcc_cv_nm
+ORIGINAL_OBJCOPY_FOR_TARGET
+gcc_cv_objcopy
 ORIGINAL_LD_GOLD_FOR_TARGET
 ORIGINAL_LD_BFD_FOR_TARGET
 ORIGINAL_LD_FOR_TARGET
@@ -23436,6 +23438,83 @@  case "$ORIGINAL_NM_FOR_TARGET" in
  ;;
 esac
 
+# Figure out what objcopy we will be using.
+if ${gcc_cv_objcopy+:} false; then :
+
+else
+
+if test -f $gcc_cv_binutils_srcdir/configure.ac \
+     && test -f ../binutils/Makefile \
+     && test x$build = x$host; then
+	gcc_cv_objcopy=../binutils/objcopy$build_exeext
+elif test -x objcopy$build_exeext; then
+	gcc_cv_objcopy=./objcopy$build_exeext
+elif ( set dummy $OBJCOPY_FOR_TARGET; test -x $2 ); then
+        gcc_cv_objcopy="$OBJCOPY_FOR_TARGET"
+else
+        # Extract the first word of "$OBJCOPY_FOR_TARGET", so it can be a program name with args.
+set dummy $OBJCOPY_FOR_TARGET; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_gcc_cv_objcopy+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $gcc_cv_objcopy in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_gcc_cv_objcopy="$gcc_cv_objcopy" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_gcc_cv_objcopy="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+gcc_cv_objcopy=$ac_cv_path_gcc_cv_objcopy
+if test -n "$gcc_cv_objcopy"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_objcopy" >&5
+$as_echo "$gcc_cv_objcopy" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what objcopy to use" >&5
+$as_echo_n "checking what objcopy to use... " >&6; }
+if test "$gcc_cv_objcopy" = ../binutils/objcopy$build_exeext; then
+	# Single tree build which includes binutils.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: newly built objcopy" >&5
+$as_echo "newly built objcopy" >&6; }
+	in_tree_objcopy=yes
+else
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_objcopy" >&5
+$as_echo "$gcc_cv_objcopy" >&6; }
+	in_tree_objcopy=no
+fi
+
+ORIGINAL_OBJCOPY_FOR_TARGET=$gcc_cv_objcopy
+
+case "$ORIGINAL_OBJCOPY_FOR_TARGET" in
+  ./objcopy | ./objcopy$build_exeext) ;;
+  *) ac_config_files="$ac_config_files objcopy:exec-tool.in"
+ ;;
+esac
 
 # Figure out what objdump we will be using.
 if ${gcc_cv_objdump+:} false; then :
@@ -33176,6 +33255,7 @@  do
     "as") CONFIG_FILES="$CONFIG_FILES as:exec-tool.in" ;;
     "collect-ld") CONFIG_FILES="$CONFIG_FILES collect-ld:exec-tool.in" ;;
     "nm") CONFIG_FILES="$CONFIG_FILES nm:exec-tool.in" ;;
+    "objcopy") CONFIG_FILES="$CONFIG_FILES objcopy:exec-tool.in" ;;
     "dsymutil") CONFIG_FILES="$CONFIG_FILES dsymutil:exec-tool.in" ;;
     "clearcap.map") CONFIG_LINKS="$CONFIG_LINKS clearcap.map:${srcdir}/config/$clearcap_map" ;;
     "$all_outputs") CONFIG_FILES="$CONFIG_FILES $all_outputs" ;;
@@ -33811,6 +33891,7 @@  $as_echo "$as_me: executing $ac_file com
     "as":F) chmod +x as ;;
     "collect-ld":F) chmod +x collect-ld ;;
     "nm":F) chmod +x nm ;;
+    "objcopy":F) chmod +x objcopy ;;
     "dsymutil":F) chmod +x dsymutil ;;
     "default":C)
 case ${CONFIG_HEADERS} in
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2815,6 +2815,36 @@  case "$ORIGINAL_NM_FOR_TARGET" in
   *) AC_CONFIG_FILES(nm:exec-tool.in, [chmod +x nm]) ;;
 esac
 
+# Figure out what objcopy we will be using.
+AS_VAR_SET_IF(gcc_cv_objcopy,, [
+if test -f $gcc_cv_binutils_srcdir/configure.ac \
+     && test -f ../binutils/Makefile \
+     && test x$build = x$host; then
+	gcc_cv_objcopy=../binutils/objcopy$build_exeext
+elif test -x objcopy$build_exeext; then
+	gcc_cv_objcopy=./objcopy$build_exeext
+elif ( set dummy $OBJCOPY_FOR_TARGET; test -x $[2] ); then
+        gcc_cv_objcopy="$OBJCOPY_FOR_TARGET"
+else
+        AC_PATH_PROG(gcc_cv_objcopy, $OBJCOPY_FOR_TARGET)
+fi])
+
+AC_MSG_CHECKING(what objcopy to use)
+if test "$gcc_cv_objcopy" = ../binutils/objcopy$build_exeext; then
+	# Single tree build which includes binutils.
+	AC_MSG_RESULT(newly built objcopy)
+	in_tree_objcopy=yes
+else
+	AC_MSG_RESULT($gcc_cv_objcopy)
+	in_tree_objcopy=no
+fi
+
+ORIGINAL_OBJCOPY_FOR_TARGET=$gcc_cv_objcopy
+AC_SUBST(ORIGINAL_OBJCOPY_FOR_TARGET)
+case "$ORIGINAL_OBJCOPY_FOR_TARGET" in
+  ./objcopy | ./objcopy$build_exeext) ;;
+  *) AC_CONFIG_FILES(objcopy:exec-tool.in, [chmod +x objcopy]) ;;
+esac
 
 # Figure out what objdump we will be using.
 AS_VAR_SET_IF(gcc_cv_objdump,, [
--- a/gcc/exec-tool.in
+++ b/gcc/exec-tool.in
@@ -17,7 +17,7 @@ 
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-# Invoke as, ld or nm from the build tree.
+# Invoke as, ld, nm, or objcopy from the build tree.
 
 ORIGINAL_AS_FOR_TARGET="@ORIGINAL_AS_FOR_TARGET@"
 ORIGINAL_LD_FOR_TARGET="@ORIGINAL_LD_FOR_TARGET@"
@@ -25,6 +25,7 @@  ORIGINAL_LD_BFD_FOR_TARGET="@ORIGINAL_LD
 ORIGINAL_LD_GOLD_FOR_TARGET="@ORIGINAL_LD_GOLD_FOR_TARGET@"
 ORIGINAL_PLUGIN_LD_FOR_TARGET="@ORIGINAL_PLUGIN_LD_FOR_TARGET@"
 ORIGINAL_NM_FOR_TARGET="@ORIGINAL_NM_FOR_TARGET@"
+ORIGINAL_OBJCOPY_FOR_TARGET="@ORIGINAL_OBJCOPY_FOR_TARGET@"
 ORIGINAL_DSYMUTIL_FOR_TARGET="@ORIGINAL_DSYMUTIL_FOR_TARGET@"
 exeext=@host_exeext@
 fast_install=@enable_fast_install@
@@ -72,6 +73,11 @@  case "$invoked" in
     prog=nm-new$exeext
     dir=binutils
     ;;
+  objcopy)
+    original=$ORIGINAL_OBJCOPY_FOR_TARGET
+    prog=objcopy$exeext
+    dir=binutils
+    ;;
   dsymutil)
     original=$ORIGINAL_DSYMUTIL_FOR_TARGET
     # We do not build this in tree - but still want to be able to execute