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: Malformed PE file: Unexpected flags for PE section .idata$2 #5106

Closed
gopherbot opened this issue Mar 22, 2013 · 19 comments
Closed

cmd/ld: Malformed PE file: Unexpected flags for PE section .idata$2 #5106

gopherbot opened this issue Mar 22, 2013 · 19 comments
Milestone

Comments

@gopherbot
Copy link
Contributor

by mikaelbrg:

After updating from go1.0.3 to tip, I am no longer able to build my module, which uses a
.so-file and cgo (to communicate with hardware). The log below shows the result of
building with the latest tip version (produces error), and with go1.0.3 (successful).

mikaelbe@ITK-D727 ~/work/sotest
$ go version
go version devel +9ca85035f95a Thu Mar 21 22:37:13 2013 -0700 windows/amd64

mikaelbe@ITK-D727 ~/work/sotest
$ go build sotest
# sotest
C:\Users\mikaelbe\AppData\Local\Temp\go-build854994423\sotest.a(_all.o): malform
ed pe file: unexpected flags for PE section .idata$2

mikaelbe@ITK-D727 ~/work/sotest
$ go version
go version go1.0.3

mikaelbe@ITK-D727 ~/work/sotest
$ go build sotest

What steps will reproduce the problem?
If possible, include a link to a program on play.golang.org.
1. Source code with .go, .so and .h files available at
https://bitbucket.org/mikaelbe/sotest/overview
2. Build with "go build sotest"

What is the expected output?
Executable file

What do you see instead?
Error as shown in log above

Which compiler are you using (5g, 6g, 8g, gccgo)?
Not sure.

Which operating system are you using?
Windows 7 (64-bit)

Which version are you using?  (run 'go version')
go version devel +9ca85035f95a Thu Mar 21 22:37:13 2013 -0700 


Mikael
@alexbrainman
Copy link
Member

Comment 1:

gcc rejects your libc_urg.so file:
C:\tmp\bbbb\src\bitbucket.org\mikaelbe\sotest\src\sotest>go build -x -o a
WORK=C:\DOCUME~1\brainman\LOCALS~1\Temp\go-build219604731
mkdir -p $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\
mkdir -p $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\exe\
cd c:\tmp\bbbb\src\bitbucket.org\mikaelbe\sotest\src\sotest
c:\go\root\pkg\tool\windows_386\cgo.exe -objdir
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\ -- -I
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\main.go
c:\go\root\pkg\tool\windows_386\8c.exe -F -V -w -I
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\ -I c:\go\root\pkg\windows_386 -o
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_defun.8 -D GOOS_windows -D
GOARCH_386 $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_defun.c
gcc -I . -g -O2 -m32 -mthreads -print-libgcc-file-name
gcc -I . -g -O2 -m32 -mthreads -I $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\
-o $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_main.o -c
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_main.c
gcc -I . -g -O2 -m32 -mthreads -I $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\
-o $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_export.o -c
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_export.c
gcc -I . -g -O2 -m32 -mthreads -I $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\
-o $WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\main.cgo2.o -c
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\main.cgo2.c
gcc -I . -g -O2 -m32 -mthreads -o
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_.o
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_main.o
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\_cgo_export.o
$WORK\bitbucket.org\mikaelbe\sotest\src\sotest\_obj\main.cgo2.o libc_urg.so -lm -lwinmm
# bitbucket.org/mikaelbe/sotest/src/sotest
libc_urg.so: file not recognized: File format not recognized
collect2: ld returned 1 exit status
I don't know much about .so files. Leaving for others.
Alex

@gopherbot
Copy link
Contributor Author

Comment 2 by mikaelbrg:

I don't know much about .so files either.
The file is compiled on 64-bit Windows 7. There might of course be something wrong with
the .so-file itself. However, it worked perfectly on Go 1.0.3, but won't build on tip.

@ianlancetaylor
Copy link
Member

Comment 3:

This worked in Go 1.0.3, fails on tip, let's see if we can fix it for Go 1.1.

Labels changed: added priority-soon, go1.1, removed priority-triage.

@ianlancetaylor
Copy link
Member

Comment 4:

Can you update to tip and run your test case again and report the new error message? 
Thanks.

@ianlancetaylor
Copy link
Member

Comment 5:

Possible fix at https://golang.org/cl/8715043 .

Owner changed to @ianlancetaylor.

Status changed to Started.

@alexbrainman
Copy link
Member

Comment 6:

@mikaelbrg, please also try this https://golang.org/issue/5273?c=12
suggestion in addition to Ian's change.
Thank you.
Alex

@ianlancetaylor
Copy link
Member

Comment 7:

This issue was updated by revision 9ca4a25.

Update issue #5273
R=minux.ma, r
CC=golang-dev
https://golang.org/cl/8715043

@gopherbot
Copy link
Contributor Author

Comment 8 by mikaelbrg:

Updated to go version devel +b141b8379367 Mon Apr 15 14:06:41 2013 -0700 windows/amd64.
Now I get a new error:
mikaelbe@ITK-D727 ~/work/sotest (master)
$ go build sotest
# sotest
C:\gotip\pkg\tool\windows_amd64\6l.exe: internal fatal error.
Then updated back to go1.0.3 and confirmed that it was still working there.
@alex.brainman, not sure how to apply this suggestion as I use a so-file, not dll (not
exactly an expert at this). My LDFLAGS looks like this:
#cgo LDFLAGS: libc_urg.so -lm -lwinmm
Build with -x flag, results in 6l.exe internal fatal error:
mikaelbe@ITK-D727 ~/work/sotest (master)
$ go build -x sotest
WORK=C:\Users\mikaelbe\AppData\Local\Temp\go-build698711863
mkdir -p $WORK\sotest\_obj\
mkdir -p $WORK\sotest\_obj\exe\
cd C:\Users\mikaelbe\work\sotest\src\sotest
"C:\\gotip\\pkg\\tool\\windows_amd64\\cgo.exe" -objdir "C:\\Users\\mikaelbe\\App
Data\\Local\\Temp\\go-build698711863\\sotest\\_obj\\" -- -I "C:\\Users\\mikaelbe
\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\" main.go
"C:\\gotip\\pkg\\tool\\windows_amd64\\6c.exe" -F -V -w -I "C:\\Users\\mikaelbe\\
AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\" -I "C:\\gotip\\pkg\\win
dows_amd64" -o "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\so
test\\_obj\\_cgo_defun.6" -D GOOS_windows -D GOARCH_amd64 "C:\\Users\\mikaelbe\\
AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\_cgo_defun.c"
gcc -I "C:\\Users\\mikaelbe\\work\\sotest\\src\\sotest" -g -O2 -m64 -mthreads -p
rint-libgcc-file-name
gcc -I "C:\\Users\\mikaelbe\\work\\sotest\\src\\sotest" -g -O2 -m64 -mthreads -I
 "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\"
-o "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\
_cgo_main.o" -c "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\s
otest\\_obj\\_cgo_main.c"
gcc -I "C:\\Users\\mikaelbe\\work\\sotest\\src\\sotest" -g -O2 -m64 -mthreads -I
 "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\"
-o "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\
_cgo_export.o" -c "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\
\sotest\\_obj\\_cgo_export.c"
gcc -I "C:\\Users\\mikaelbe\\work\\sotest\\src\\sotest" -g -O2 -m64 -mthreads -I
 "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\"
-o "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\
main.cgo2.o" -c "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\s
otest\\_obj\\main.cgo2.c"
gcc -I "C:\\Users\\mikaelbe\\work\\sotest\\src\\sotest" -g -O2 -m64 -mthreads -o
 "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\_c
go_.o" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_o
bj\\_cgo_main.o" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\
sotest\\_obj\\_cgo_export.o" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-buil
d698711863\\sotest\\_obj\\main.cgo2.o" libc_urg.so -lm -lwinmm
"C:\\gotip\\pkg\\tool\\windows_amd64\\cgo.exe" -objdir "C:\\Users\\mikaelbe\\App
Data\\Local\\Temp\\go-build698711863\\sotest\\_obj\\" -dynimport "C:\\Users\\mik
aelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\_cgo_.o" -dynout "
C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\_cgo
_import.c"
"C:\\gotip\\pkg\\tool\\windows_amd64\\6c.exe" -F -V -w -I "C:\\Users\\mikaelbe\\
AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\" -I "C:\\gotip\\pkg\\win
dows_amd64" -o "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\so
test\\_obj\\_cgo_import.6" -D GOOS_windows -D GOARCH_amd64 "C:\\Users\\mikaelbe\
\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\_cgo_import.c"
gcc -I "C:\\Users\\mikaelbe\\work\\sotest\\src\\sotest" -g -O2 -m64 -mthreads -o
 "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\_a
ll.o" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\sotest\\_ob
j\\_cgo_export.o" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\
\sotest\\_obj\\main.cgo2.o" libc_urg.so -Wl,-r -nostdlib -lmingwex -lmingw32 c:/
mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.3/libgcc.a
"C:\\gotip\\pkg\\tool\\windows_amd64\\6g.exe" -o "C:\\Users\\mikaelbe\\AppData\\
Local\\Temp\\go-build698711863\\sotest\\_obj\\_go_.6" -p sotest -D _/C_/Users/mi
kaelbe/work/sotest/src/sotest -I "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-
build698711863" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-build698711863\\s
otest\\_obj\\_cgo_gotypes.go" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-bui
ld698711863\\sotest\\_obj\\main.cgo1.go"
"C:\\gotip\\pkg\\tool\\windows_amd64\\pack.exe" grcP "C:\\Users\\mikaelbe\\AppDa
ta\\Local\\Temp\\go-build698711863" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\
go-build698711863\\sotest.a" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go-buil
d698711863\\sotest\\_obj\\_go_.6" "C:\\Users\\mikaelbe\\AppData\\Local\\Temp\\go
-build698711863\\sotest\\_obj\\_cgo_import.6" "C:\\Users\\mikaelbe\\AppData\\Loc
al\\Temp\\go-build698711863\\sotest\\_obj\\_cgo_defun.6" "C:\\Users\\mikaelbe\\A
ppData\\Local\\Temp\\go-build698711863\\sotest\\_obj\\_all.o"
cd .
"C:\\gotip\\pkg\\tool\\windows_amd64\\6l.exe" -o "C:\\Users\\mikaelbe\\AppData\\
Local\\Temp\\go-build698711863\\sotest\\_obj\\exe\\a.out.exe" -L "C:\\Users\\mik
aelbe\\AppData\\Local\\Temp\\go-build698711863" "C:\\Users\\mikaelbe\\AppData\\L
ocal\\Temp\\go-build698711863\\sotest.a"
# sotest
C:\gotip\pkg\tool\windows_amd64\6l.exe: internal fatal error.
Mikael

@alexbrainman
Copy link
Member

Comment 9:

ian, unfortunately https://golang.org/cl/8715043 is no good. "internal fatal
error" is displayed by our exception handler. When running in gdb, I get:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000410ca7 in readsym (obj=obj@entry=0x1fc2f40, i=i@entry=44,
    y=y@entry=0x22fc88) at c:\mingw64\go\src\cmd\6l\..\ld\ldpe.c:445
445                     name = obj->sect[sym->sectnum-1].sym->name;
(gdb) p sym
$1 = (PeSym *) 0x1fc3a98
(gdb) p sym->sectnum
$2 = 13
(gdb) p sym->sectnum-1
$3 = 12
(gdb) p obj
$4 = (PeObj *) 0x1fc2f40
(gdb) p obj->sect
$5 = (PeSect *) 0x1fc2f90
(gdb) p obj->sect[12]
$6 = {name = 0x1fc3310 ".idata$5", base = 0x0, size = 16, sym = 0x0, sh = {
    Name = ".idata$5", VirtualSize = 0, VirtualAddress = 0,
    SizeOfRawData = 16, PointerToRawData = 3791, PointerToRelocations = 4116,
    PointerToLineNumbers = 0, NumberOfRelocations = 1,
    NumberOfLineNumbers = 0, Characteristics = 3224371200}}
(gdb)
so we cannot just ignore sections. I am not sure what correct fix is, but I will look
further when I have time.
Alex

@alexbrainman
Copy link
Member

Comment 10:

Similar to https://golang.org/issue/5273, the example works fine
until:
changeset:   13896:5334356f42b3
user:        Shenghou Ma <[email protected]>
date:        Fri Aug 17 03:42:34 2012 +0800
summary:     cmd/go: new cgo build procedure
and is broken since.
Alex

@alexbrainman
Copy link
Member

Comment 11:

mikaelbrg, please try https://golang.org/cl/8676050/
Thank you.
Alex

@gopherbot
Copy link
Contributor Author

Comment 12 by mikaelbrg:

Alex, https://golang.org/cl/8676050/ allows my project to be built (sotest,
bitbucket link in original report), but it fails at runtime.
This is what happens at tip with your patch:
mikaelbe@ITK-D727 ~/work/sotest (master)
$ go version
go version devel +13e00572ed0b Thu Apr 18 17:37:21 2013 -0700 windows/amd64
mikaelbe@ITK-D727 ~/work/sotest (master)
$ go build sotest
mikaelbe@ITK-D727 ~/work/sotest (master)
$ sotest
unexpected fault address 0x46e3d3
fatal error: fault
[signal 0xc0000005 code=0x1 addr=0x46e3d3 pc=0x351eb0]
goroutine 1 [syscall]:
[fp=0x351e50] return()
        c:/gotip/src/pkg/runtime/asm_amd64.s:508
[fp=0x351e98] runtime.cgocall(0x46e3d3, 0x351eb0)
        c:/gotip/src/pkg/runtime/cgocall.c:162 +0x133
[fp=0x351eb0] main._Cfunc_urg_connect(0xc200050000, 0x5d7140, 0x1c200, 0x46e3d3)
        C:/Users/mikaelbe/AppData/Local/Temp/go-build753753471/sotest/_obj/_cgo_
defun.c:46 +0x32
[fp=0x351ef0] main.(*Urg).Connect(0xc200000038, 0xc200050000, 0x1)
        C:/Users/mikaelbe/AppData/Local/Temp/go-build753753471/sotest/_obj/_cgo_
gotypes.go:147 +0x58
[fp=0x351f90] main.main()
        C:/Users/mikaelbe/AppData/Local/Temp/go-build753753471/sotest/_obj/_cgo_
gotypes.go:161 +0x5c
[fp=0x351fb8] runtime.main()
        c:/gotip/src/pkg/runtime/proc.c:182 +0x99
[fp=0x351fc0] runtime.goexit()
        c:/gotip/src/pkg/runtime/proc.c:1223
goroutine 2 [syscall]:
This is what happens with Go1.0.3:
mikaelbe@ITK-D727 ~/work/sotest (master)
$ go version
go version go1.0.3
mikaelbe@ITK-D727 ~/work/sotest (master)
$ go build sotest
mikaelbe@ITK-D727 ~/work/sotest (master)
$ sotest
open failed: COM7
Connection error.
(Connection fails because hardware is not present, but the program behaves nicely).

@minux
Copy link
Member

minux commented Apr 19, 2013

Comment 13:

could you please provide source code for libc_urg.so and
the procedure to build it?
it's just a DLL with a .so name, so i don't know it doesn't
work.

@alexbrainman
Copy link
Member

Comment 14:

This issue was updated by revision 782a578.

R=golang-dev, r, iant
CC=golang-dev
https://golang.org/cl/8676050

@gopherbot
Copy link
Contributor Author

Comment 15 by mikaelbrg:

@minux,
The source code is available at
http://www.hokuyo-aut.jp/02sensor/07scanner/download/urg_programs_en/
It is build with:
./configure --prefix=/mingw64 LDFLAGS=-lwinmm
make
make install
If used at that time, I get "not defined"-errors for all the C functions when I build
the Go project.
I then proceeded to make the SO-file like this:
gcc -o libc_urg.so -shared -u urg_connect libc_urg.a libc_urg_system.a
libc_urg_connection.a -lwinmm
Mikael

@gopherbot
Copy link
Contributor Author

Comment 16 by mikaelbrg:

Update: I seem to have got it to work by linking to the .a-files, like this:
// #cgo LDFLAGS: /MinGW/mingw64/lib/libc_urg.a /MinGW/mingw64/lib/libc_urg_connection.a
/MinGW/mingw64/lib/libc_urg_system.a -lm -lwinmm
I don't know if this is what I should have done to begin with, or if this is a hack.
Either way, the project builds without errors, and seems to work when running the
executable.
If I have wasted your time, I'm sorry for that. However, my previous strategy worked for
go1.0.3.
Mikael

@alexbrainman
Copy link
Member

Comment 17:

@mikaelbrg, glad you have a workable solution. I do not know much about gcc. Perhaps,
others will help.
Alex

@robpike
Copy link
Contributor

robpike commented May 19, 2013

Comment 18:

Labels changed: added go1.2, removed go1.1.

@ianlancetaylor
Copy link
Member

Comment 19:

The immediate problem has been worked around.  The long term fix is to implement
external linking for Windows.  I don't know if there is any reasonable fix short of that.

Status changed to Duplicate.

Merged into issue #4069.

@rsc rsc added this to the Go1.2 milestone Apr 14, 2015
@rsc rsc removed the go1.2 label Apr 14, 2015
@golang golang locked and limited conversation to collaborators Jun 24, 2016
This issue was closed.
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