# cairo und lto

## Klaus Meier

Ich habe gerade das Problem, dass sich cairo-1.12.16-r4 mit dem USE-Flag lto nicht übersetzen lässt. Ich bin ja beim gcc 4.9.2. Wollte mal nachfragen, wie es bei denen aussieht, die noch beim gcc 4.8.3 sind. Gerade bei lto soll der 4.9 ja deutliche Verbesserungen bringen. Ich wollte erst mal hier nachfragen, bevor ich ewig am gcc-4.8.3 rumkompiliere und der 4.9.2 ist ja auch noch maskiert.

Die Fehlermeldung sind so aus:

```
/var/tmp/portage/x11-libs/cairo-1.12.16-r4/temp/ccx6CehJ.ltrans0.ltrans.o: In function `main':

ccx6CehJ.ltrans0.o:(.text.startup+0x13d): undefined reference to `cairo_boilerplate_get_target_by_name'

ccx6CehJ.ltrans0.o:(.text.startup+0x191): undefined reference to `cairo_boilerplate_xmalloc'

ccx6CehJ.ltrans0.o:(.text.startup+0x26d): undefined reference to `cairo_boilerplate_xmalloc'

ccx6CehJ.ltrans0.o:(.text.startup+0x410): undefined reference to `cairo_boilerplate_xmalloc'

ccx6CehJ.ltrans0.o:(.text.startup+0x58d): undefined reference to `cairo_boilerplate_xmalloc'

ccx6CehJ.ltrans0.o:(.text.startup+0x5ee): undefined reference to `cairo_boilerplate_xmalloc'

/var/tmp/portage/x11-libs/cairo-1.12.16-r4/temp/ccx6CehJ.ltrans0.ltrans.o:ccx6CehJ.ltrans0.o:(.text.startup+0x66f): more undefined references to `cairo_boilerplate_xmalloc' follow

/var/tmp/portage/x11-libs/cairo-1.12.16-r4/temp/ccx6CehJ.ltrans0.ltrans.o: In function `main':

ccx6CehJ.ltrans0.o:(.text.startup+0x99b): undefined reference to `cairo_boilerplate_xrealloc'

ccx6CehJ.ltrans0.o:(.text.startup+0xc2d): undefined reference to `cairo_boilerplate_xrealloc'

ccx6CehJ.ltrans0.o:(.text.startup+0xfd7): undefined reference to `cairo_boilerplate_xrealloc'

ccx6CehJ.ltrans0.o:(.text.startup+0x11ca): undefined reference to `cairo_boilerplate_xrealloc'

/var/tmp/portage/x11-libs/cairo-1.12.16-r4/temp/ccx6CehJ.ltrans1.ltrans.o: In function `_surface_create.lto_priv.8':

ccx6CehJ.ltrans1.o:(.text+0x56): undefined reference to `cairo_boilerplate_xmalloc'

/var/tmp/portage/x11-libs/cairo-1.12.16-r4/temp/ccx6CehJ.ltrans1.ltrans.o: In function `get_surface_size':

ccx6CehJ.ltrans1.o:(.text+0x153): undefined reference to `cairo_boilerplate_xmalloc'

/var/tmp/portage/x11-libs/cairo-1.12.16-r4/temp/ccx6CehJ.ltrans1.ltrans.o: In function `_context_create.lto_priv.9':

ccx6CehJ.ltrans1.o:(.text+0x1d8): undefined reference to `cairo_boilerplate_xmalloc'

/var/tmp/portage/x11-libs/cairo-1.12.16-r4/temp/ccx6CehJ.ltrans1.ltrans.o: In function `recorder.lto_priv.11':

ccx6CehJ.ltrans1.o:(.text+0xf44): undefined reference to `cairo_boilerplate_xmalloc'

ccx6CehJ.ltrans1.o:(.text+0x113a): undefined reference to `cairo_boilerplate_xrealloc'

collect2: error: ld returned 1 exit status

Makefile:589: recipe for target 'cairo-sphinx' failed

make[4]: *** [cairo-sphinx] Error 1

make[4]: Leaving directory '/var/tmp/portage/x11-libs/cairo-1.12.16-r4/work/cairo-1.12.16-abi_x86_64.amd64/util/cairo-sphinx'

Makefile:974: recipe for target 'all-recursive' failed

make[3]: *** [all-recursive] Error 1

make[3]: Leaving directory '/var/tmp/portage/x11-libs/cairo-1.12.16-r4/work/cairo-1.12.16-abi_x86_64.amd64/util'

Makefile:756: recipe for target 'all' failed

make[2]: *** [all] Error 2

make[2]: Leaving directory '/var/tmp/portage/x11-libs/cairo-1.12.16-r4/work/cairo-1.12.16-abi_x86_64.amd64/util'

Makefile:895: recipe for target 'all-recursive' failed

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory '/var/tmp/portage/x11-libs/cairo-1.12.16-r4/work/cairo-1.12.16-abi_x86_64.amd64'

Makefile:745: recipe for target 'all' failed
```

----------

## Josef.95

Schau ob die schon genannten Tipps aus Bug 510782 weiterhelfen.

----------

## Jean-Paul

Funktioniert hier einwandfrei  *Quote:*   

> [ebuild   R   ~] x11-libs/cairo-1.12.16-r3  USE="X glib lto svg (-aqua) -debug -directfb (-drm) (-gallium) (-gles2) -legacy-drivers -opengl -openvg (-qt4) -static-libs -valgrind -xcb -xlib-xcb" 0 kB
> 
> [ebuild   R    ] sys-devel/gcc-4.8.3:4.8  USE="cxx fortran nls nptl openmp sanitize (-altivec) -awt -doc (-fixed-point) -gcj -go -graphite (-hardened) (-libssp) -mudflap (-multilib) (-multislot) -nopie -nossp -objc -objc++ -objc-gc -regression-test -vanilla"

 

----------

## Klaus Meier

Danke an euch beide. Ja, den Bug hatte ich schon gelesen und die angegebene Lösung, -lto, hatte ich ja auch schon gefunden.

Wenn ich mich noch richtig zurück erinnere, dann ging die r3 (damals noch ohne lto) mit dem gcc-4.9.1 sauber durch. Mit dem gcc-4.9.2 wollte dann auch die r3 nicht. Hatte jetzt auf die r4 gehofft, dass sie das Problem löst. Hab den Beitrag ja in erster Linie geschrieben, um ohne stundenlange emerge Orgien zu sehen, an was es liegt. Und der letzte Satz:

```
USE="-lto" solves the problem
```

ist dann ja wohl doch etwas heftig. Nein, er löst das Problem nicht, es ist nur ein quick and dirty fix.

Werde dann mal im Laufe des Tages ausprobieren, was der gcc-4.9.1 dazu sagt. Wenn es mit dem 4.8.3 und dem 4.9.1 sauber durchläuft, dann ist es ein Problem von cairo. Ansonsten eines vom gcc-4.9.2.

----------

## Josef.95

Hm nee, ich meinte eher den Tipp mit den CFLAGS/CXXFLAGS aus Comment 6 , 8 und 9

----------

## Jean-Paul

 *Josef.95 wrote:*   

> Hm nee, ich meinte eher den Tipp mit den CFLAGS/CXXFLAGS aus Comment 6 , 8 und 9

 

Ja, das schein das Problem zu lösen.

Siehe auch hier https://code.google.com/p/chromium/issues/detail?id=360604

Vorausgesetzt du hast genug Speicher.

 *Quote:*   

> >>> Running pre-merge checks for x11-libs/cairo-1.12.16-r3
> 
>  * Checking for sufficient memory to build cairo with USE=lto
> 
>  * Checking for at least 768 MiB RAM ...                                 [ ok ]

 

----------

## Klaus Meier

Bingo. lto zu entfernen ist peng. -ffat-lto-objects hat die Sache gelöst.

Danke Josef für die Hinweise auf 6, 8 und 9.

Ist also kein Problem vom gcc oder von cairo. Ist eine Sache der default-flags.

----------

