[Problem] Strace - can't handle reloc type 0x7e

edgecrusher

Mitglied
Mitglied seit
4 Mai 2008
Beiträge
303
Punkte für Reaktionen
4
Punkte
18
Hallo,

ich habe mit freetz für eine verkappte 7170 (die Alice IAD 3331) strace via Freetz (aktuellster Trunk) kompiliert. Ich bin einfach mal davon ausgegangen, das die Vorraussetzungen für den erfolgreichen Start des Programs gleich sind.

Das ganze als stand-alone binary via make strace-precompiled. Ins Image eingebaut in den Pfad /usr/sbin/strace und entsprechende Rechte gesetze. Beim Start bekomme ich aber nun folgende Fehlermeldung

Code:
# strace -h

strace: symbol 'stdout': can't handle reloc type 0x7e
#

Kann es sein, dass das doch nicht so einfach möglich ist? Ich hab dann nochmal ein Image gebaut mit einer strace Binary von meiner 7570, die dort korrekt drauf läuft.

Ergebnis, gleicher Fehler:

Code:
# strace -h

strace: symbol 'stdout': can't handle reloc type 0x7e
#


Ich muss sagen ich habe bis jetzt mit freetz nur komplette Images gebaut und keine einzelnen Pakete und kenne mich also dort nicht besonders aus. Kann mit mal einer einen Tip geben wo ich mich einlesen muss wie ich dieses Binary ausführbar machen kann oder besser was dieser Fehler bedeutet und was eventuell fehlt.

Gruß
Edge
 
Die dynamisch gelinkten Binaries, die mit freetz-download-toolchain erstellt werden, sind mit der uClibc-Version der unmodifierten Firmware nicht kompatibel (gilt nur für uClibc-0.9.29). Du versucht das Binary offensichtlich auf einer unmodifizierten Box auszuführen. Lösungen:
  • strace statisch linken (für statisch gelinkte Binaries gilt diese Einschränkung nicht), oder
  • die Toolchain selbst bauen (d.h. keine download-toolchain verwenden) und beim Bauen der Toolchain die Option Create toolchain compatible with original firmware aktivieren (kurz zusammengefasst die Symbole FREETZ_BUILD_TOOLCHAIN und FREETZ_TARGET_TOOLCHAIN_AVM_COMPATIBLE müssen aktiviert werden)
 
Oder als weitere Möglichkeit, wenn man schon ein eigenes Image erstellt, dann auch gleich /lib/ld-uClibc-0.9.29.so aus dem Freetz Image übernehmen.
 
Ziel ist nur das Ändern einiger Sachen aber unter größtmöglicher Beibehaltung des "Original Zustands" des Image. Daher fällt die 2. Möglichkeit (erstmal) weg. Es ist zwar eine ganz "dumme" Frage, aber ich bin auf der freetz.org Wiki Seite nicht wirklich schlau geworden, aber wie linke ich ein Paket statisch. Ich meine, gibt es irgendwo ein Anfänger How to, wo der Ablauf beschrieben ist und auf welche Fallstricke man achten sollte?

Wie gesagt, so tief in die Materie bin ich nie eingedrungen, würde aber gerne was dazu lernen.

Gruß
edge
 
..., aber wie linke ich ein Paket statisch.
In deinem Fall hier, kannst Du mit einem Linux/unix-Editor die "strace.mk"-Datei (... Zeile 14 ergänzen, Zeile 15 neu, auf die Formatierung achten) ergänzen:
Code:
	$(SUBMAKE) -C $(STRACE_DIR) \
	LDFLAGS="-L$(TARGET_TOOLCHAIN_STAGING_DIR)/lib -static"
Code:
.../freetz-devel> file packages/target-mipsel_uClibc-0.9.32.1/strace-4.6/root/usr/sbin/strace
packages/target-mipsel_uClibc-0.9.32.1/strace-4.6/root/usr/sbin/strace: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x3040000, stripped
Code:
root@fritz:/var/media/ftp/uStor02/archiv# ldd ./strace
        not a dynamic executable
Code:
root@fritz:/var/media/ftp/uStor02/archiv# ./strace -h
usage: strace [-CdDffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file]
              [-p pid] ... [-s strsize] [-u username] [-E var=val] ...
              [command [arg ...]]
   or: strace -c [-D] [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ...
              [command [arg ...]]
-c -- count time, calls, and errors for each syscall and report summary
-C -- like -c but also print regular output while processes are running
-f -- follow forks, -ff -- with output into separate files
-F -- attempt to follow vforks, -h -- print help message
-i -- print instruction pointer at time of syscall
-q -- suppress messages about attaching, detaching, etc.
-r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs
-T -- print time spent in each syscall, -V -- print version
-v -- verbose mode: print unabbreviated argv, stat, termio[s], etc. args
-x -- print non-ascii strings in hex, -xx -- print all strings in hex
-a column -- alignment COLUMN for printing syscall results (default 40)
-e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]...
   options: trace, abbrev, verbose, raw, signal, read, or write
-o file -- send trace output to FILE instead of stderr
-O overhead -- set overhead for tracing syscalls to OVERHEAD usecs
-p pid -- trace process with process id PID, may be repeated
-D -- run tracer process as a detached grandchild, not as parent
-s strsize -- limit length of print strings to STRSIZE chars (default 32)
-S sortby -- sort syscall counts by: time, calls, name, nothing (default time)
-u username -- run command as username handling setuid and/or setgid
-E var=val -- put var=val in the environment for command
-E var -- remove var from the environment for command
 
Erstmal Danke an alle, die Hilfe hier ist ein Traum!

Hab jetzt das strace.mk File angepasst und kompiliert. Wenn ich das jetzt mit ldd prüfe (dieses einfach nur via make ldd-precompiled erstellt) bekomme ich folgende Ausgabe, welche Erfolg propagiert

Code:
freetz@freetz-linux:~freetz-trunk$ ldd ./strace
        \tDas Programm ist nicht dynamisch gelinkt

Werd das ganze mal auf meine Box packen und gucken ob es geht. Wenn ich das gleiche für ldd machen will, kann ich dann genau das

Code:
	$(SUBMAKE) -C $(STRACE_DIR) \
	LDFLAGS="-L$(TARGET_TOOLCHAIN_STAGING_DIR)/lib -static"

anwenden oder muss ich das für jedes Package irgendwie einpassen. Ich frage nur, weil das ldd.mk File von seiner Syntax ein wenig anders aussieht als das strace.mk File

Muss ich dann einfach

Code:
$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
	$(FREETZ_LD_RUN_PATH) \
		$(TARGET_CC) \
		$(TARGET_CFLAGS) \
		-DUCLIBC_RUNTIME_PREFIX=\ \
		$(LDD_SOURCE_FILE) -o $@

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
	$(INSTALL_BINARY_STRIP)

in

Code:
$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
[COLOR="#FF0000"]	$(SUBMAKE) -C $([COLOR="#0000FF"]LDD_DIR[/COLOR]) \
	LDFLAGS="-L$(TARGET_TOOLCHAIN_STAGING_DIR)/lib -static"[/COLOR]
	$(FREETZ_LD_RUN_PATH) \
		$(TARGET_CC) \
		$(TARGET_CFLAGS) \
		-DUCLIBC_RUNTIME_PREFIX=\ \
		$(LDD_SOURCE_FILE) -o $@

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
	$(INSTALL_BINARY_STRIP)

ändern?

Gruß
Edge

Nachtrag: IHR SEID! DIE BESTEN. Es läuft. Danke für die Hilfe!
 
Zuletzt bearbeitet:
Hehe, willst Du jetzt alle Freetz-Pakete statisch gelinkt kompilieren? ;-)
... muss ich das für jedes Package irgendwie einpassen. Ich frage nur, weil das ldd.mk File von seiner Syntax ein wenig anders aussieht als das strace.mk File

Muss ich dann einfach
....
in
Code:
	LDFLAGS="-L$(TARGET_TOOLCHAIN_STAGING_DIR)/lib -static"
	$(FREETZ_LD_RUN_PATH) \
		$(TARGET_CC) \
		$(TARGET_CFLAGS) \
		-DUCLIBC_RUNTIME_PREFIX=\ \
		$(LDD_SOURCE_FILE) -o $@
$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
	$(INSTALL_BINARY_STRIP)
ändern?
Die Zeile 19 der "ldd.mk" wie folgt ändern:
Code:
		$(LDD_SOURCE_FILE) -o $@ -static
 
Ich sagte ja, das ich das noch nicht so gut kenne :p

Sag mal, wo kann man sich in diese Materie mal einlesen, außer jetzt auf dem Freetz Wiki. Gibt es da allgemeine Seiten wo man das lernen kann, sprich mk File Syntax und warum setze ich in dem einen mk File (strace) den Parameter so und warum in dem anderen (ldd) ebend anders. Für mich sind es (noch) bömische Dörfer.
 
..., sprich mk File Syntax und warum setze ich in dem einen mk File (strace) den Parameter so und warum in dem anderen (ldd) ebend anders. ...
Für den Anfang, siehe die "make/Makefile.in"-Datei, die manpage von gcc und basics in C-Programmierung.
 
Wenn Du dem Vorschlag von er13 gefolgt wärst, müsstest Du nicht für jedes einzelne Programm hier nachfragen, und die Programme wären kleiner.
Aber warum einfach, wenn es auch kompliziert geht.
 
Hallo Ralf,

Wenn ich dich und er jetzt richtig verstanden habe, sollte ich folgendes machen

1. Aktuellen Freetz Trunk Löschen
2. komplett neu ausschecken
3. make menuconfig
4. dort FW 7170 auswählen
5. Advance Ooptions -> Toolchain Options -> Build Toolchain (requieres 4 GB discspace) aktivieren
6.

Folgende Optionen bleiben wie voreingestellt

Kernel Compile = gcc-3.4.6
Target uClib = 0.9.29
uClib mod = mod
target compiler = gcc-4.5.3

und alle anderen Option die als Preset bei Build Toolchain stehen

7. zusätzlich aktiviere ich Create Toolchain compatible with original firmware
8. speichern alles
9. make oder kann man auch gezielt nur die toolchain bauen lassen (make toolchain, bringt das was oder sollte ich komplett make einmal durchlaufen lassen?)

Wenn das dann gebaut ist, kann ich im Grunde jedes Package kompilieren und es sollte auf einer Original FW (also eine "nicht" gefreetze FW) laufen? Brauche ich dann nicht extra statisch kompilieren (wenn ich es statisch haben möchte)?

Tut mir leid wegen den vielen Fragen. Ich gebe zu, hab mich vorher nicht eingelesen in die Materie, aber für die wenigen Programme dich jetzt brauche, ist das durchaus nicht wenig (um das im Gesamten zu verstehen).

Gruß
Edge
 
Brauche ich dann nicht extra statisch kompilieren (wenn ich es statisch haben möchte)?
Wenn Du es _statisch_ haben willst, dann musst Du _immer_ statisch gelinkt kompilieren, ohne Rücksicht auf die toolchain & Co. . ;-)
 
Ich würde es erst einmal versuchen, ohne alles zu löschen, nur die zwei Änderungen, die er13 vorgeschlagen hat: Toolchain selbst erstellen, und Toolchain kompatibel mit AVM Firmware erstellen. Evtl. "make toolchain-dirclean" aufrufen.
"make toolchain" erstellt die Toolchain.
Wenn es damit Schwierigkeiten gibt, kannst Du immer noch neu auschecken, am Besten vorher das Verzeichnis dl mit den Download sichern.

Wenn das dann gebaut ist, kann ich im Grunde jedes Package kompilieren und es sollte auf einer Original FW (also eine "nicht" gefreetze FW) laufen? Brauche ich dann nicht extra statisch kompilieren (wenn ich es statisch haben möchte)?
Genau, damit sollte jedes Paket auf einer original Firmware laufen.
Die Pakete werden damit nicht automatisch statisch übersetzt, sondern es ist nicht mehr notwendig, sie statisch zu übersetzen.

Noch einfacher ist es natürlich, direkt das Freetz Image zu verwenden.
 
Ich wollts einfach nochmal ganz sauber haben und habs neu ausgecheckt. Aktuell rödelt mein C2D E8400 schon seit 2 Stunden. Lt. Wiki dauert das bauen der toolchain 20-60 minuten (ich weiß da kommt natürlich noch ne Menge dazu). Hat einer Mal ne ungefähre Zeit wie lange das 1. make bei geänderten toolchain Parametern dauern kann?

Edge :D
 
20-60 Minuten? Also 20 Minuten halte ich für unrealistisch, selbst mit 8 Kernen. Wie lange das 1. make dauert hängt natürlich auch von den ausgewählten Paketen ab. Die Tools brauchen ca. 5 Minuten, die Toolchain sollte nach 45-60 Minuten fertig sein, dann kommen noch die Pakete, Libraries und der Kernel. Und schlussendlich nochmal 2 Minuten für die Firmware.

Gruß
Oliver
 
Ich weiß, ich denke ich nerve schon, aber eine Frage habe ich noch. Ich hab das ganze jetzt so eingerichtet wie er und ralf das gesagt haben und das läuft auch super, Binaries werden ohne Fehlermeldung ausgeführt.

Jetzt hab ich ltrace gebaut (make ltrace-precompiled) und es läuft auf Fehler, mir fehlt ne lib

Code:
# ./ltrace -h
./ltrace: can't load library 'libelf.so.0'
#

Ich denke ich muss unter Advanced Options -> Shared Libraries -> libelf.so "aktivieren". Da ich aber kein (komplettes) Freetz Image baue (also nicht einen kompletten make Durchlauf nutze) sondern meine FW nur mit fwmod entpacke, erweitere, packe und flashe, kann man eine bestimmte Lib einfach unabhängig bauen, wenn ja wie? Auch hier habe ich im Freetz Wiki nichts (vielleicht auch einfach nur nicht das richtige) gefunden und google schmiss (speziell für freetz) auch nichts raus.

Könntet ihr mir da nochmal auf die Sprünge helfen.

Heißen Dank auf jeden Fall schonmal im voraus.

Gruß
Edge
 
Wie schon geschrieben, wäre es das einfachste, ein Freetz Image zu verwenden.

Wenn Du das nicht willst, musst Du selbst dafür sorgen, dass die Library auf die Box kommt, da nützt es nichts, in der Freetz Config die Library zu aktivieren. Die Libraries, die für die ausgewählten Programme benötigt werden, erstellt Freetz automatisch.
 
Sehe ich es richtig, das ich dann folgendes machen kann:

1. ich erstelle ein komplettes Freetz Image mit den Packages und den dazugehörigen Libs (in einem getrennt runtergeladenen Trunk).
2. In einem 2. Trunk mit der selbstgebauten Toolchain und der Option "Create Toolchain compatible with original firmware" erstelle ich mir die einzelnen Packages die ich dann auf meiner Box nutzen möchte.
3. fehlende Libs extrahiere ich aus dem 1. "Freetz" Image und packe die in meine FW.

Kann es da irgendwie zu Problemen kommen oder kann man diesen Hybrid so nutzen? Test kann ich es erst später.

Gruß
 
Nein, Du tust 2. und 3., die Libs extrahierst Du dabei aus 2 (die Libs aus 1. werden genauso auf das Problem "can't handle reloc type 0x7e" laufen).

p.s. Ich zitiere mal ralf: aber warum einfach, wenn es auch kompliziert geht.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.