Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/ld: multiple definition of `__moddi3' under archlinux/go1.4/i686 #9437

Closed
fasheng opened this issue Dec 24, 2014 · 6 comments
Closed

cmd/ld: multiple definition of `__moddi3' under archlinux/go1.4/i686 #9437

fasheng opened this issue Dec 24, 2014 · 6 comments
Milestone

Comments

@fasheng
Copy link

fasheng commented Dec 24, 2014

I build a sample for this case and tested on platforms and architectures. Only archlinux/go1.4/i686 could not compile success.

Here is the error messages, results table and sample code(package github.com/mattn/go-sqlite3 is required).

Error

/var/tmp/go-link-2fmgPU/000002.o: In function `__moddi3':
(.text+0x75460): multiple definition of `__moddi3'
/var/tmp/go-link-2fmgPU/00000.o:(.text+0xf70): first defined here
collect2: error: ld returned 1 exit status
/usr/lib/go/pkg/tool/linux_386/8l: running gcc failed: unsuccessful exit status 0x100

Results

  | platform     | arch   | version            | result |
  |--------------+--------+--------------------+--------|
  | archlinux    | i686   | go 2:1.4-1         | failed |
  | archlinux    | x86_64 | go 2:1.4-1         | ok     |
  | archlinux    | i686   | go 2:1.3.3-1       | failed |
  | archlinux    | x86_64 | go 2:1.3.3-1       | ok     |
  | ubuntu 14.04 | i686   | evarlast/golang1.4 | ok     |
  | ubuntu 14.04 | x86_64 | evarlast/golang1.4 | ok     |
  | ubuntu 14.04 | i686   | golang 2:1.3.3-1.1 | ok     |
  | ubuntu 14.04 | x86_64 | golang 2:1.3.3-1.1 | ok     |

Sample

package main

// #cgo CFLAGS: -Wall -g
// #include <stdlib.h>
// #include <sys/types.h>  /* for time_t */
//
// typedef long int_fast32_t;
// typedef long long intmax_t;
//
// #define SECSPERMIN   60
// #define MINSPERHOUR  60
// #define SECSPERHOUR  (SECSPERMIN * MINSPERHOUR)
// #define HOURSPERDAY  24
// #define EPOCH_YEAR   1970
// #define DAYSPERNYEAR 365
// #define SECSPERDAY   ((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
// #define SECSPERNYEAR (SECSPERDAY * DAYSPERNYEAR)
// #define SECSPERLYEAR (SECSPERNYEAR + SECSPERDAY)
//
// #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
//
// time_t
// yeartot(const intmax_t y)
// {
//     register intmax_t   myy, seconds, years;
//     register time_t     t;
//     myy = EPOCH_YEAR;
//     t = 0;
//     while (myy < y) {
//         seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
//         years = 1;
//         myy += years;
//         t += seconds;
//     }
//     return t;
// }
import "C"

import (
    "fmt"
    _ "github.com/mattn/go-sqlite3"
)

func main() {
    fmt.Printf("Hello, world\n")
}
@ianlancetaylor ianlancetaylor changed the title build: cgo report multiple definition of `__moddi3' under archlinux/go1.4/i686 cmd/ld: multiple definition of `__moddi3' under archlinux/go1.4/i686 Dec 24, 2014
@ianlancetaylor ianlancetaylor added this to the Go1.5 milestone Dec 24, 2014
@mwhudson
Copy link
Contributor

mwhudson commented Jan 4, 2015

This looks more likely to be a bug in the gcc(go) bits than the go bits. Can you show the version of the gcc/gccgo/gccgo-4.9 packages you have installed? And a gist of the output of running go build -compiler gccgo -x ?

@fasheng
Copy link
Author

fasheng commented Jan 5, 2015

For ubuntu, gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2.
For archlinux, gcc (GCC) 4.9.2 20141224 (prerelease).

And gccgo just build succeeded in archlinux/i686, here is the output,

WORK=/tmp/go-build056603244
mkdir -p $WORK/github.com/mattn/go-sqlite3/_obj/
mkdir -p $WORK/github.com/mattn/
cd /usr/lib/go/site/src/github.com/mattn/go-sqlite3
CGO_LDFLAGS="-g" "-O2" "-ldl" "-lsqlite3" /usr/lib/go/pkg/tool/linux_386/cgo -objdir $WORK/github.com/mattn/go-sqlite3/_obj/ -gccgo -gccgopkgpath=github.com/mattn/go-sqlite3 -- -I $WORK/github.com/mattn/go-sqlite3/_obj/ -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE backup.go error.go sqlite3.go sqlite3_other.go
gcc -Wall -g -I $WORK/github.com/mattn/go-sqlite3/_obj/ -I /usr/lib/go/pkg/linux_386 -o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_defun.o -D GOOS_linux -D GOARCH_386 -m32 -D "GOPKGPATH=\"github_com_mattn_go_sqlite3\"" -c $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_defun.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -print-libgcc-file-name
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/github.com/mattn/go-sqlite3/_obj/ -g -O2 -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE -o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_main.o -c $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_main.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/github.com/mattn/go-sqlite3/_obj/ -g -O2 -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE -o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_export.o -c $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_export.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/github.com/mattn/go-sqlite3/_obj/ -g -O2 -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE -o $WORK/github.com/mattn/go-sqlite3/_obj/backup.cgo2.o -c $WORK/github.com/mattn/go-sqlite3/_obj/backup.cgo2.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/github.com/mattn/go-sqlite3/_obj/ -g -O2 -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE -o $WORK/github.com/mattn/go-sqlite3/_obj/error.cgo2.o -c $WORK/github.com/mattn/go-sqlite3/_obj/error.cgo2.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/github.com/mattn/go-sqlite3/_obj/ -g -O2 -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE -o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.cgo2.o -c $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.cgo2.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/github.com/mattn/go-sqlite3/_obj/ -g -O2 -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE -o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3_other.cgo2.o -c $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3_other.cgo2.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/github.com/mattn/go-sqlite3/_obj/ -g -O2 -std=gnu99 -I. -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE -o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.o -c ./sqlite3.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_.o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_main.o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_export.o $WORK/github.com/mattn/go-sqlite3/_obj/backup.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/error.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3_other.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.o -g -O2 -ldl -lsqlite3
gccgo -I $WORK -c -g -m32 -fgo-pkgpath=github.com/mattn/go-sqlite3 -fgo-relative-import-path=_/usr/lib/go/site/src/github.com/mattn/go-sqlite3 -o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.o ./doc.go $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_gotypes.go $WORK/github.com/mattn/go-sqlite3/_obj/backup.cgo1.go $WORK/github.com/mattn/go-sqlite3/_obj/error.cgo1.go $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.cgo1.go $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3_other.cgo1.go
ar cru $WORK/github.com/mattn/libgo-sqlite3.a $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_defun.o $WORK/github.com/mattn/go-sqlite3/_obj/_cgo_export.o $WORK/github.com/mattn/go-sqlite3/_obj/backup.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/error.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3_other.cgo2.o $WORK/github.com/mattn/go-sqlite3/_obj/sqlite3.o
mkdir -p $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/
cd /home/fsh/tmp/go1.4_issue_386
CGO_LDFLAGS="-g" "-O2" /usr/lib/go/pkg/tool/linux_386/cgo -objdir $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/ -gccgo -- -I $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/ -Wall -g main.go
gcc -Wall -g -I $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/ -I /usr/lib/go/pkg/linux_386 -o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_defun.o -D GOOS_linux -D GOARCH_386 -m32 -c $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_defun.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/ -g -O2 -Wall -g -o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_main.o -c $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_main.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/ -g -O2 -Wall -g -o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_export.o -c $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_export.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -I $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/ -g -O2 -Wall -g -o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.cgo2.o -c $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.cgo2.c
gcc -I . -fPIC -m32 -pthread -fmessage-length=0 -o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_main.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_export.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.cgo2.o -g -O2
gccgo -I $WORK -I /usr/lib/go/site/pkg/gccgo_linux_386 -c -g -m32 -fgo-relative-import-path=_/home/fsh/tmp/go1.4_issue_386 -o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_gotypes.go $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.cgo1.go
ar cru $WORK/_/home/fsh/tmp/libgo1.4_issue_386.a $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_defun.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_export.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.cgo2.o
cd .
gccgo -o go1.4_issue_386 $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_defun.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/_cgo_export.o $WORK/_/home/fsh/tmp/go1.4_issue_386/_obj/main.cgo2.o -Wl,-( -m32 $WORK/github.com/mattn/libgo-sqlite3.a -lpthread -ldl -lsqlite3 -Wl,-E -Wl,-)

@ianlancetaylor
Copy link
Contributor

The names 00000.o and 000002.o indicate that the __moddi3 symbol is being defined in multiple object files compiled by gcc, which is odd. (This doesn't have anything to do with gccgo as far as I can see.)

For the failing build, please run "go build -x" and show us the complete output. Thanks.

@ianlancetaylor
Copy link
Contributor

Actually, never mind, I can recreate this easily enough. Issue #9510.

Now I don't know why ArchLinux is different from any other GNU/Linux system.

@hami9x
Copy link

hami9x commented Mar 28, 2015

I'm getting the same problem on Ubuntu 14.04.

@minux
Copy link
Member

minux commented Mar 28, 2015

Merge into #9510. This is a general problem, not specific to any linux distribution.

@minux minux closed this as completed Mar 28, 2015
@golang golang locked and limited conversation to collaborators Jun 25, 2016
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

6 participants