Bug 17984 - GDB fails to build on Aarch64 when -fno-common is enabled.
Summary: GDB fails to build on Aarch64 when -fno-common is enabled.
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: gdb (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-02-16 15:31 UTC by Maxim Ostapenko
Modified: 2015-02-24 22:07 UTC (History)
4 users (show)

See Also:
Host:
Target: aarch64-linux-gnu
Build:
Last reconfirmed:
Project(s) to access:
ssh public key:


Attachments
Trivial fix (300 bytes, patch)
2015-02-16 15:31 UTC, Maxim Ostapenko
Details | Diff
Trivial fix - 2 (399 bytes, patch)
2015-02-16 16:48 UTC, Maxim Ostapenko
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Maxim Ostapenko 2015-02-16 15:31:52 UTC
Created attachment 8131 [details]
Trivial fix

When testing, I found out, that building GDB with -fno-common option fails on Aarch64 with:

[  190s] gcc -O2 -g2 -feliminate-unused-debug-types -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector -Wformat -Wformat-security -fmessage-length=0 -g -O0 -fno-common   -static-libstdc++ -static-libgcc    \
[  190s] >-------o gdb gdb.o aarch64-tdep.o aarch64-linux-tdep.o glibc-tdep.o linux-tdep.o solib-svr4.o symfile-mem.o ser-base.o ser-unix.o ser-pipe.o ser-tcp.o inf-ptrace.o fork-child.o aarch64-linux-nat.o proc-service.o linux-thread-db.o linux-nat.o linux-fork.o linux-procfs.o linux-ptrace.o linux-osdata.o linux-waitpid.o linux-personality.o remote.o dcache.o tracepoint.o ax-general.o ax-gdb.o remote-fileio.o remote-notif.o ctf.o tracefile.o tracefile-tfile.o  cli-dump.o cli-decode.o cli-script.o cli-cmds.o cli-setshow.o cli-logging.o cli-interp.o cli-utils.o mi-out.o mi-console.o mi-cmds.o mi-cmd-catch.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o mi-cmd-file.o mi-cmd-disas.o mi-symbol-cmds.o mi-cmd-target.o mi-cmd-info.o mi-interp.o mi-main.o mi-parse.o mi-getopt.o tui-command.o tui-data.o tui-disasm.o tui-file.o tui-hooks.o tui-interp.o tui-io.o tui-layout.o tui-out.o tui-regs.o tui-source.o tui-stack.o tui-win.o tui-windata.o tui-wingeneral.o tui-winsource.o tui.o python.o py-arch.o py-auto-load.o py-block.o py-bpevent.o py-breakpoint.o py-cmd.o py-continueevent.o py-xmethods.o py-event.o py-evtregistry.o py-evts.o py-exitedevent.o py-finishbreakpoint.o py-frame.o py-framefilter.o py-function.o py-gdb-readline.o py-inferior.o py-infevents.o py-infthread.o py-lazy-string.o py-linetable.o py-newobjfileevent.o py-objfile.o py-param.o py-prettyprint.o py-progspace.o py-signalevent.o py-stopevent.o py-symbol.o py-symtab.o py-threadevent.o py-type.o py-utils.o py-value.o py-varobj.o guile.o elfread.o stap-probe.o posix-hdep.o posix-strerror.o c-exp.o cp-name-parser.o ada-exp.o jv-exp.o d-exp.o f-exp.o go-exp.o m2-exp.o p-exp.o version.o annotate.o addrmap.o auto-load.o auxv.o agent.o bfd-target.o blockframe.o breakpoint.o break-catch-sig.o break-catch-throw.o findvar.o regcache.o cleanups.o charset.o continuations.o corelow.o disasm.o dummy-frame.o dfp.o source.o value.o eval.o valops.o valarith.o valprint.o printcmd.o block.o symtab.o psymtab.o symfile.o symfile-debug.o symmisc.o linespec.o dictionary.o infcall.o infcmd.o infrun.o expprint.o environ.o stack.o thread.o exceptions.o extension.o filesystem.o filestuff.o inf-child.o interps.o minidebug.o main.o macrotab.o macrocmd.o macroexp.o macroscope.o mi-common.o event-loop.o event-top.o inf-loop.o completer.o gdbarch.o arch-utils.o gdbtypes.o gdb_bfd.o gdb_obstack.o osabi.o copying.o memattr.o mem-break.o target.o target-dcache.o parse.o language.o build-id.o buildsym.o findcmd.o std-regs.o signals.o exec.o reverse.o bcache.o objfiles.o observer.o minsyms.o maint.o demangle.o dbxread.o coffread.o coff-pe-read.o dwarf2read.o mipsread.o stabsread.o corefile.o dwarf2expr.o dwarf2loc.o dwarf2-frame.o dwarf2-frame-tailcall.o ada-lang.o c-lang.o d-lang.o f-lang.o objc-lang.o ada-tasks.o ada-varobj.o c-varobj.o ui-out.o cli-out.o varobj.o vec.o go-lang.o go-valprint.o go-typeprint.o jv-lang.o jv-valprint.o jv-typeprint.o jv-varobj.o m2-lang.o opencl-lang.o p-lang.o p-typeprint.o p-valprint.o sentinel-frame.o complaints.o typeprint.o ada-typeprint.o c-typeprint.o f-typeprint.o m2-typeprint.o ada-valprint.o c-valprint.o cp-valprint.o d-valprint.o f-valprint.o m2-valprint.o serial.o mdebugread.o top.o utils.o ui-file.o user-regs.o frame.o frame-unwind.o doublest.o frame-base.o inline-frame.o gnu-v2-abi.o gnu-v3-abi.o cp-abi.o cp-support.o cp-namespace.o reggroups.o trad-frame.o tramp-frame.o solib.o solib-target.o prologue-value.o memory-map.o memrange.o xml-support.o xml-syscall.o xml-utils.o target-descriptions.o target-memory.o xml-tdesc.o xml-builtin.o inferior.o osdata.o gdb_usleep.o record.o record-full.o gcore.o gdb_vecs.o jit.o progspace.o skip.o probe.o common-utils.o buffer.o ptid.o gdb-dlfcn.o common-agent.o format.o registry.o btrace.o record-btrace.o waitstatus.o print-utils.o rsp-low.o errors.o common-debug.o debug.o common-exceptions.o btrace-common.o compile.o compile-c-symbols.o compile-c-types.o compile-object-load.o compile-object-run.o compile-loc2c.o compile-c-support.o inflow.o    init.o \
[  190s] >------   ../readline/libreadline.a ../opcodes/libopcodes.a ../bfd/libbfd.a  ../libiberty/libiberty.a ../libdecnumber/libdecnumber.a    -ldl -ldl -lncurses -lm -ldl     -lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic /usr/lib64/libexpat.so   ../libiberty/libiberty.a  build-gnulib/import/libgnu.a -ldl -Wl,--dynamic-list=./proc-service.list
[  199s] aarch64-linux-nat.o: In function `initialize_tdesc_aarch64':
[  199s] /home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/features/aarch64.c:11: multiple definition of `tdesc_aarch64'
[  199s] aarch64-tdep.o:/home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/objfiles.h:540: first defined here
[  199s] aarch64-linux-nat.o: In function `initialize_tdesc_aarch64':
[  199s] /home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/features/aarch64.c:11: multiple definition of `tdesc_aarch64'
[  199s] aarch64-tdep.o:/home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/objfiles.h:540: first defined here
[  199s] collect2: error: ld returned 1 exit status
[  199s] make[2]: *** [gdb] Error 1
[  199s] make[2]: Leaving directory `/home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb'
[  199s] make[1]: *** [all-gdb] Error 2
[  199s] make[1]: Leaving directory `/home/abuild/rpmbuild/BUILD/gdb-7.8.1'
[  199s] make: *** [all] Error 2
[  199s] error: Bad exit status from /var/tmp/rpm-tmp.YfrTV4 (%build)


This happens because struct target_desc *tdesc_aarch64 is defined in gdb/features/aarch64.c source file, that is included to many other source files
(gdb/aarch64-linux-nat.c, for example). So, we have multiple definition of `tdesc_aarch64' error during link stage.

One possible solution for this issue is replacing 'struct target_desc *tdesc_aarch64' with 'extern struct target_desc *tdesc_aarch64' in gdb/features/aarch64.c and defining this pointer into another source file, for example gdb/aarch64-linux-nat.c.

Trivial fix is attached.
Comment 1 Pedro Alves 2015-02-16 16:21:56 UTC
Note features/aarch64.c is autogenerated (see top of file).

Instead, please remove the '#include "features/aarch64.c"' line
from aarch64-linux-nat.c, and add

extern struct target_desc *tdesc_aarch64;

to aarch64-tdep.h.

Try "grep tdesc_powerpc_e500l *" to see the same thing done for PowerPC.

You'll need to remove the initialize_tdesc_aarch64 line from aarch64_linux_read_description, but that's really not necessary anyway - that's already called in aarch64-tdep.c, at GDB startup.
Comment 2 Maxim Ostapenko 2015-02-16 16:48:34 UTC
Created attachment 8133 [details]
Trivial fix - 2
Comment 3 Maxim Ostapenko 2015-02-16 16:50:10 UTC
Pedro, thank you for your reply.

(In reply to Pedro Alves from comment #1)
> Note features/aarch64.c is autogenerated (see top of file).
> 
> Instead, please remove the '#include "features/aarch64.c"' line
> from aarch64-linux-nat.c, and add
> 
> extern struct target_desc *tdesc_aarch64;
> 
> to aarch64-tdep.h.
> 
> Try "grep tdesc_powerpc_e500l *" to see the same thing done for PowerPC.
> 
> You'll need to remove the initialize_tdesc_aarch64 line from
> aarch64_linux_read_description, but that's really not necessary anyway -
> that's already called in aarch64-tdep.c, at GDB startup.

Yes it works fine for me, I'm attaching another patch. Perhaps I should send it to ML?
Comment 4 Pedro Alves 2015-02-16 16:56:53 UTC
Yes, please.  If you could bundle that with a ChangeLog entry and a git commit log, it'd be great.  See:

  https://sourceware.org/gdb/wiki/ContributionChecklist

Thanks!
Comment 5 Sourceware Commits 2015-02-17 09:45:46 UTC
The master branch has been updated by Pedro Alves <palves@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9f2e07213aa91f1882112df3e0d227638b7a085b

commit 9f2e07213aa91f1882112df3e0d227638b7a085b
Author: Maxim Ostapenko <m.ostapenko@partner.samsung.com>
Date:   Mon Feb 16 20:24:53 2015 +0400

    Fix GDB build fail on Aarch64 when -fno-common is enabled
    
    Current trunk GDB (and gdb-7.8.1 too) fails to build on Aarch64 when
    -fno-common is enabled.  It fails during link stage due to multiple
    definition of `tdesc_aarch64':
    
    ...
    [  199s] aarch64-linux-nat.o: In function `initialize_tdesc_aarch64':
    [  199s]
    /home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/features/aarch64.c:11:
    multiple definition of `tdesc_aarch64'
    [  199s]
    aarch64-tdep.o:/home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/objfiles.h:540:
    first defined here
    [  199s] aarch64-linux-nat.o: In function `initialize_tdesc_aarch64':
    [  199s]
    /home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/features/aarch64.c:11:
    multiple definition of `tdesc_aarch64'
    [  199s]
    aarch64-tdep.o:/home/abuild/rpmbuild/BUILD/gdb-7.8.1/gdb/objfiles.h:540:
    first defined here
    [  199s] collect2: error: ld returned 1 exit status
    [  199s] make[2]: *** [gdb] Error 1
    ...
    
    This happens because struct target_desc *tdesc_aarch64 is defined in
    gdb/features/aarch64.c, which is included by two files
    (gdb/aarch64-linux-nat.c and gdb/aarch64-tdep.c).
    
    gdb/Changelog
    2015-02-17  Max Ostapenko  <m.ostapenko@partner.samsung.com>
    
    	PR gdb/17984
    	* aarch64-linux-nat.c: Don't include features/aarch64.c anymore.
    	(aarch64_linux_read_description): Remove initialize_tdesc_aarch64
    	call.
    	* aarch64-tdep.h (tdesc_aarch64): Declare.
Comment 6 Yao Qi 2015-02-24 22:07:22 UTC
Close as it is fixed.