Herr_Mann
Anmeldungsdatum: 22. August 2016
Beiträge: Zähle...
|
Hallo, ich probiere meinen Code mit PGO zu kompilieren. | #include <stdio.h>
int main(void)
{puts("test");return 0;}
|
Das obige Programm lässt sich problemlos mit gcc für Linux kompilieren. D.h. gcc -fprofile-generate -o test test.c -lgcov läuft durch Benutze ich allerdings den mingw cross compiler kommen folgende Fehlermeldungen.
| x86_64-w64-mingw32-gcc -fprofile-generate -o test test.c
/tmp/cccj8pnx.o:test.c:(.text+0x1a): undefined reference to `__gcov_indirect_call_profiler_v2'
/tmp/cccj8pnx.o:test.c:(.text+0x46): undefined reference to `__gcov_time_profiler'
/tmp/cccj8pnx.o:test.c:(.data+0xa0): undefined reference to `__gcov_merge_time_profile'
/tmp/cccj8pnx.o:test.c:(.rdata$.refptr.__gcov_indirect_call_callee[.refptr.__gcov_indirect_call_callee]+0x0): undefined reference to `__gcov_indirect_call_callee'
collect2: error: ld returned 1 exit status
|
Hier die Version die bei mir installiert ist: | x86_64-w64-mingw32-gcc -v
Using built-in specs.
COLLECT_GCC=x86_64-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/lto-wrapper
Target: x86_64-w64-mingw32
Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libexecdir='/usr/lib/gcc-mingw-w64' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libgomp --enable-languages=c,c++,fortran,objc,obj-c++ --enable-lto --with-plugin-ld --enable-threads=win32 --program-suffix=-win32 --program-prefix=x86_64-w64-mingw32- --target=x86_64-w64-mingw32 --with-as=/usr/bin/x86_64-w64-mingw32-as --with-ld=/usr/bin/x86_64-w64-mingw32-ld --disable-libatomic
Thread model: win32
gcc version 5.3.1 20160211 (GCC)
|
Auf meinem Laptop mit archlinux tritt das selbe Problem auf. Weiß jmd. warum ich den Code nur in einem Fall instrumentalisieren kann? Freundliche Grüße
Hermann
|
Herr_Mann
(Themenstarter)
Anmeldungsdatum: 22. August 2016
Beiträge: 3
|
Ich habe mir die Vorgängerversion, Ubuntu 1404, in einer virutellen Maschine installiert. Dann wollte ich das obige Beispielprogramm mit x86_64-w64-mingw32-gcc -fprofile-generate -v -o test.exe test.c -lgcov -static kompilieren. Auf Ubuntu 1404 klappt alles wie erwartet, bei Ubuntu 1604 klappt das Linken nicht. Hier mal der Output. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | Using built-in specs.
COLLECT_GCC=x86_64-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/4.8/lto-wrapper
Target: x86_64-w64-mingw32
Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --libexecdir='/usr/lib/gcc-mingw-w64' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --enable-version-specific-runtime-libs --enable-threads=posix --enable-fully-dynamic-string --enable-sjlj-exceptions --enable-libgomp --enable-languages=c,c++,fortran,objc,obj-c++ --enable-lto --with-plugin-ld --target=x86_64-w64-mingw32 --with-gxx-include-dir=/usr/include/c++/4.8 --with-as=/usr/bin/x86_64-w64-mingw32-as --with-ld=/usr/bin/x86_64-w64-mingw32-ld
Thread model: posix
gcc version 4.8.2 (GCC)
COLLECT_GCC_OPTIONS='-fprofile-generate' '-v' '-o' 'test.exe' '-static' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-w64-mingw32/4.8/cc1 -quiet -v -D_REENTRANT test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -fprofile-generate -o /tmp/cczAADkd.s
GNU C (GCC) version 4.8.2 (x86_64-w64-mingw32)
compiled by GNU C version 4.8.2, GMP version 5.1.2, MPFR version 3.1.2-p3, MPC version 1.0.1
warning: GMP header version 5.1.2 differs from library version 5.1.3.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-w64-mingw32/4.8/../../../../x86_64-w64-mingw32/sys-include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-w64-mingw32/4.8/include
/usr/lib/gcc/x86_64-w64-mingw32/4.8/include-fixed
/usr/lib/gcc/x86_64-w64-mingw32/4.8/../../../../x86_64-w64-mingw32/include
End of search list.
GNU C (GCC) version 4.8.2 (x86_64-w64-mingw32)
compiled by GNU C version 4.8.2, GMP version 5.1.2, MPFR version 3.1.2-p3, MPC version 1.0.1
warning: GMP header version 5.1.2 differs from library version 5.1.3.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 992c516e84bc6a87b695a0238c39d051
COLLECT_GCC_OPTIONS='-fprofile-generate' '-v' '-o' 'test.exe' '-static' '-mtune=generic' '-march=x86-64'
/usr/bin/x86_64-w64-mingw32-as -v -o /tmp/ccxS0e6c.o /tmp/cczAADkd.s
GNU assembler version 2.23.52 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.23.52.20130620
COMPILER_PATH=/usr/lib/gcc/x86_64-w64-mingw32/4.8/:/usr/lib/gcc/x86_64-w64-mingw32/4.8/:/usr/lib/gcc/x86_64-w64-mingw32/:/usr/lib/gcc/x86_64-w64-mingw32/4.8/:/usr/lib/gcc/x86_64-w64-mingw32/
LIBRARY_PATH=/usr/lib/gcc/x86_64-w64-mingw32/4.8/:/usr/lib/gcc/x86_64-w64-mingw32/4.8/../../../../x86_64-w64-mingw32/lib/
COLLECT_GCC_OPTIONS='-fprofile-generate' '-v' '-o' 'test.exe' '-static' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-w64-mingw32/4.8/collect2 -m i386pep -Bstatic -o test.exe /usr/lib/gcc/x86_64-w64-mingw32/4.8/../../../../x86_64-w64-mingw32/lib/crt2.o /usr/lib/gcc/x86_64-w64-mingw32/4.8/../../../../x86_64-w64-mingw32/lib/crtbegin.o -L/usr/lib/gcc/x86_64-w64-mingw32/4.8 -L/usr/lib/gcc/x86_64-w64-mingw32/4.8/../../../../x86_64-w64-mingw32/lib /tmp/ccxS0e6c.o -lgcov -lgcov -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt /usr/lib/gcc/x86_64-w64-mingw32/4.8/../../../../x86_64-w64-mingw32/lib/crtend.o
|
Und hier der für Ubuntu 1604: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | Using built-in specs.
COLLECT_GCC=x86_64-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/lto-wrapper
Target: x86_64-w64-mingw32
Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libexecdir='/usr/lib/gcc-mingw-w64' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libgomp --enable-languages=c,c++,fortran,objc,obj-c++ --enable-lto --with-plugin-ld --enable-threads=win32 --program-suffix=-win32 --program-prefix=x86_64-w64-mingw32- --target=x86_64-w64-mingw32 --with-as=/usr/bin/x86_64-w64-mingw32-as --with-ld=/usr/bin/x86_64-w64-mingw32-ld --disable-libatomic
Thread model: win32
gcc version 5.3.1 20160211 (GCC)
COLLECT_GCC_OPTIONS='-fprofile-generate' '-v' '-o' 'test.exe' '-static' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/cc1 -quiet -v -U_REENTRANT test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -fprofile-generate -o /tmp/ccUV8WbR.s
GNU C11 (GCC) version 5.3.1 20160211 (x86_64-w64-mingw32)
compiled by GNU C version 5.3.1 20160211, GMP version 6.1.0, MPFR version 3.1.3-p5, MPC version 1.0.3
warning: MPFR header version 3.1.3-p5 differs from library version 3.1.4.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/../../../../x86_64-w64-mingw32/sys-include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/include
/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/include-fixed
/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/../../../../x86_64-w64-mingw32/include
End of search list.
GNU C11 (GCC) version 5.3.1 20160211 (x86_64-w64-mingw32)
compiled by GNU C version 5.3.1 20160211, GMP version 6.1.0, MPFR version 3.1.3-p5, MPC version 1.0.3
warning: MPFR header version 3.1.3-p5 differs from library version 3.1.4.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 4e5ad9f99369683ad45c73b2a694109e
COLLECT_GCC_OPTIONS='-fprofile-generate' '-v' '-o' 'test.exe' '-static' '-mtune=generic' '-march=x86-64'
/usr/bin/x86_64-w64-mingw32-as -v -o /tmp/ccOIqsZ1.o /tmp/ccUV8WbR.s
GNU assembler version 2.26 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.26
COMPILER_PATH=/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/:/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/
LIBRARY_PATH=/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/:/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/../../../../x86_64-w64-mingw32/lib/
COLLECT_GCC_OPTIONS='-fprofile-generate' '-v' '-o' 'test.exe' '-static' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/collect2 -m i386pep -Bstatic -o test.exe /usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/../../../../x86_64-w64-mingw32/lib/crt2.o /usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/../../../../x86_64-w64-mingw32/lib/crtbegin.o -L/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32 -L/usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/../../../../x86_64-w64-mingw32/lib /tmp/ccOIqsZ1.o -lgcov -lgcov -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt /usr/lib/gcc/x86_64-w64-mingw32/5.3-win32/../../../../x86_64-w64-mingw32/lib/crtend.o
/tmp/ccOIqsZ1.o:test.c:(.text+0x1a): undefined reference to `__gcov_indirect_call_profiler_v2'
/tmp/ccOIqsZ1.o:test.c:(.text+0x46): undefined reference to `__gcov_time_profiler'
/tmp/ccOIqsZ1.o:test.c:(.data+0xa0): undefined reference to `__gcov_merge_time_profile'
/tmp/ccOIqsZ1.o:test.c:(.rdata$.refptr.__gcov_indirect_call_callee[.refptr.__gcov_indirect_call_callee]+0x0): undefined reference to `__gcov_indirect_call_callee'
collect2: error: ld returned 1 exit status
|
Große Unterschiede sind mir nicht aufgefallen. In Ubuntu 1604 werden win32-threads anstelle von posix-threads verwendet. Allerdings sollte das keinen Unterschied machen...
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Kennst Du Dich damit denn aus, dass Du Dir da so sicher bist ? Ich würde nämlich in genau diesem Unterschied den Knackpunkt vermuten, hervorgerufen durch unterschiedliche configure - Parameter. Allerdings kenne ich mich definitiv nicht damit aus, aber ich finde z.B. die angemeckerte Referenz __gcov_merge_time_profile unmittelbar im Kernel-Code wieder. Das sieht also so aus, als wäre das sehr wohl Kernel-spezifisch anstatt Win-API ... Von daher würde ich wenigstens probehalber die configure - Zeile von 14.04 mal 'rüber nehmen nach 16.04 und gucken, was passiert. LG, track
|
Herr_Mann
(Themenstarter)
Anmeldungsdatum: 22. August 2016
Beiträge: 3
|
Nein, ich kenne mich damit eigentlich nicht aus. Ich bin nur durch Zufall über den Fehler gestolpert und habe mich gefragt, warum das nicht so funktioniert wie ich es mir denke. Mir ist es gelungen, das Paket gcc-mingw-64 zu bauen. Dabei ist am Ende eine Version herausgekommen, welche win32-threads unterstützt und eine die posix-threads nutzt. Allerdings kriege ich mit beiden immer noch den selben Fehler. Ich werde in Zukunft das einfachere -fprofile-arcs benutzen. Allerdings ist x86_64-w64-mingw32-gcc-5.4-posix -fprofile-arcs -o test.exe test.c -static -fprofile-arcs --coverage nicht ganz so gut wie -fprofile-generate. Über den Zusammenhang zwischen -fprofile-generate und -fprofile-arcs wird hier berichtet: http://stackoverflow.com/questions/13881292/gcc-profile-guided-optimization-pgo
|