Klappt bei Euch das Übersetzen von gdb unter readline-6.1?

Kurama

Member
Hallo!

Vor geschätzt gut einem Jahr hatte ich Schwierigkeiten beim Durchführen von "portupgrade devel/gdb6". Unter meinem System konnte ich das Ding nur mit einem Hack übersetzen und habe mal kurz bei dem zuständigen Maintainer nachgefragt. Nach seiner Aussage lies sich das Problem aber bei ihm nicht reproduzieren, und ich ließ die Sache auf sich beruhen.

Nun hatte ich aber gerade auf einem anderen Rechner dasselbe Problem und wollte mich mal umhören, ob es sich dabei immer nur um Einzelfälle handelt.

Hier eine kurze Beschreibung:

Beim Linken bricht "portupgrade devel/gdb6" mit dieser Fehlermeldung ab:
Code:
libgdb.a(tui-io.o)(.text+0x24d): In function `tui_setup_io':
: undefined reference to `readline_echoing_p'
libgdb.a(tui-io.o)(.text+0x280): In function `tui_setup_io':
: undefined reference to `readline_echoing_p'
libgdb.a(tui-io.o)(.text+0x36c): In function `tui_setup_io':
: undefined reference to `readline_echoing_p'

Anscheinend kann der Linker die Variable "readline_echoing_p" nicht finden, die in der Datei "/usr/ports/devel/gdb6/work/gdb-6.6/gdb/tui/tui-io.c" in der Funktion "void tui_setup_io (int mode)" durch "extern int readline_echoing_p" in der Zeile 508 deklariert wurde.

Im Netz habe ich unter http://bugs.gentoo.org/show_bug.cgi?id=259932 den Hinweis gefunden, daß der Fehler unter der Bedingung "sys-libs/readline" >= 6.0 (Linux-Pfad!) auftreten soll.

Beim Untersuchen meiner "libreadline" fiel mir damals folgendes auf:
Code:
$ nm /usr/local/lib/libreadline.so.6 | grep echoing
00031bdc B _rl_echoing_p

Bei meinem alten Hack hatte ich probeweise in der "tui-io.c" den Namen an diese Variable angepaßt, zwar nicht systematisch getestet, aber es schien ersteinmal zu laufen.

<hinweis>
Bevor mich noch jemand für einen Hirni hält: Selbstverständlich ist mir klar, daß das großer Mist war. Daß auch hier, wie allg. üblich, die führenden Tiefstriche von "_rl_echoing_p" eine private Variable bezeichnen, wurde mir bestätigt, als ich die Definition von "_rl_echoing_p" in der "rlprivate.h" gefunden habe. Zudem läßt sich aus den "CHANGES" ersehen, warum in der letzten Zeit Änderungen beim "Echoing" durchgeführt wurden. Den veränderten GDB habe ich daher nur testweise verwendet.
</hinweis>

Jetzt zu meiner Folgerung: Meine Version des GDB6 greift dummerweise direkt auf eine Variable von libreadline zu; zu allem Übel existiert diese in der neuen, verbesserten Version nicht mehr.

Falls jemand das Ding bei sich übersetzt bekäme, müßte er gemäß meiner Theorie entweder über eine ältere libreadline (vor 6.0?) oder einen neueren GDB (nach 6.6?) verfügen. Dieser befindet sich aber nicht in meinem Ports-Verzeichnis:
Code:
$ ls -dl /usr/ports/devel/gdb*
drwxr-xr-x  3 root  wheel  512 Feb  2  2009 /usr/ports/devel/gdb53-act
drwxr-xr-x  4 root  wheel  512 Aug  5 09:46 /usr/ports/devel/gdb6
drwxr-xr-x  4 root  wheel  512 Aug  5 12:49 /usr/ports/devel/gdb66
drwxr-xr-x  2 root  wheel  512 Jan  6  2010 /usr/ports/devel/gdbmods

$ grep PORT /usr/ports/devel/gdb6/Makefile | head -3
PORTNAME=       gdb
PORTVERSION=    6.6
PORTREVISION=   2

$ grep PORT /usr/ports/devel/gdb66/Makefile | head -3
PORTNAME=       gdb
PORTVERSION=    6.6
PORTREVISION=   2

$ pkg_info | grep readline
readline-6.1        A library [...]

$ uname -a
FreeBSD wilbis 7.3-RELEASE FreeBSD 7.3-RELEASE #4: Wed Apr 21 12:37:17 CEST 2010 root@wilbis:/usr/obj/usr/src/sys/WILBIS_SCENIC_E  i386

Mein Ports-Verzeichnis sollte eigentlich aktuell sein, gibt das Erwartete aber anscheinend nicht her.

Gruß
Kurama
 
Hallo,

mit installiertem 'readline-6.1' bricht der Build von '/devel/gdb6' bei mir mit gleicher Fehlermeldung auch ab.
Ohne installiertem 'readline-6.1' läuft der Build durch.

Getestet unter 6.4-RELEASE-p7.
 
Vielen Dank seven0fx, das war ein Volltreffer. Anscheinend scheint es zwei readlines zu geben:

Code:
$ ldd /usr/ports/devel/gdb6/work/gdb-6.6/gdb/gdb
/usr/ports/devel/gdb6/work/gdb-6.6/gdb/gdb:
        libreadline.so.7 => /lib/libreadline.so.7 (0x28273000)
        libncurses.so.7 => /lib/libncurses.so.7 (0x282a3000)
        libm.so.5 => /lib/libm.so.5 (0x282e1000)
        libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x282f6000)
        libexpat.so.6 => /usr/local/lib/libexpat.so.6 (0x283ec000)
        libkvm.so.4 => /lib/libkvm.so.4 (0x2840b000)
        libc.so.7 => /lib/libc.so.7 (0x28413000)

Wenn kein "devel/readline" installiert wurde, nimmt GDB sich die des BSD-Userlands. Ich werde demnächst mal schauen, ob man die Autotools dazu bringen kann, gegen die richtige Library zu linken.
 
So, ich habe mir die Meldungen beim Build mal etwas genauer angeschaut. Anscheinend wurde bereits ein Patch eingespielt:
Code:
===>  Applying FreeBSD patches for gdb-6.6_2
echo 'READLINE = -lreadline' >> /usr/ports/devel/gdb6/work/gdb-6.6/gdb/Makefile.in

Wenn ich den Patch patche, klappt es auch mit installiertem "devel/readline":
Code:
$ diff Makefile.in.00 Makefile.in
3242c3242
< READLINE = -lreadline
---
> READLINE = -L/usr/lib -lreadline
 
Zurück
Oben