[Problem] Segmentation fault bei Shared objects

Thalhammer

Neuer User
Mitglied seit
8 Nov 2010
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Hallo,
Ich schreibe momentan eine Software für einen Speedport W501V.
Das klappt auch so weit ganz gut, ich hab mir von freetz einen Crosscompiler bauen lassen und dass original FW image entpackt und abgespeckt.
Das Problem ist nun aber folgendes: will ich die Anwendung ausführen führt dies bei C Anwendungen zu einem Segmentation fault.
Das skurille ist aber folgendes: linke ich die Anwendung statisch, so dass diese nicht mehr auch libgcc_s.so zugreift funktionierd alles einwandfrei.
Leider kann ich das nicht machen, da die Anwendung schon jetzt als statische 570KB groß ist und ich habe bis jetzt nur einen bruchteil der Funktionen implementiert. Zudem muss auch noch ein Webinterface mit rein und da ich eh nur 4MB Flash und 16MB Ram hab ist dass ganze eh schon knapp.
Ich bin also darauf angewiesen, das die endgültige version dynamisch gelinkt wird. Ich vermute das irgendwie die Libs im image und die, gegen die der Compiler linkt inkompatibel sind.

MFG Thalhammer
 
Ich bin also darauf angewiesen, das die endgültige version dynamisch gelinkt wird. Ich vermute das irgendwie die Libs im image und die, gegen die der Compiler linkt inkompatibel sind.
Dann linke deine Anwendung, nicht gegen die libs aus dem Image, sondern dynamisch gegen die brauchbaren libs und installiere diese brauchbaren libs auf deinem Router.
 
Funktionieren dann die AVM anwendungen noch ?
 
linke gegen die "AVM-Libs", besonders AVMs ulibc (ich hatte es so verstanden, dass du mit Freetz baust, dann nutzt er beim Linken die Freetz-Libs).

Oder bringe gleich ein Freetz auf die Box, dann passen die Libs wieder zu deinem Programm. Je nachdem, was du alles NICHT brauchst (Telefonie, WLAN, ...) könntest du schon einiges an Platz im Image schaffen...
 
wie soll ich gegen die avm lib linken ?
wenn ich versuche die uclib im lib verzeichnis des toolchain gegen die aus dem image zu ersetzen beschwerd er sich dass er irgendwelche symbole nicht findet.
//EDIT:
Ich hab jetzt die libs im image,gegen die aus dem Toolchain ersetzt, die AVM anwendungen gehen noch, meine aber nicht, sie stürtzt mit
symbol '_ZSt4cout': can't handle reloc type 0x7e
ab.
//EDIT2:
Ein komplettes Image kann ich auch nicht erstellen, da diese immer in einer Reboot schleife hängen, da der watchdog nicht gestoppt wird.
 
Zuletzt bearbeitet:
Gegen den Fehler
can't handle reloc type 0x7e
hilft es, die Toolchain selber zu bauen und vorher die Option
-> Advanced options -> Toolchain options -> Create toolchain compatible with original firmware
auszuwählen.

Komfortabler ist es aber vermutlich Freetz irgendwie zum Laufen zu bekommen.
 
Also irgendwie hatte ich mir woll mein complettes Freetz zerschoßen, keine Ahnung wie aber durch das viele Probieren ist wohl was schief gegangen.
Hab jetzt das komplette freetz noch mal gelöscht und neu erstellt und jetzt laufen die images.
Jetzt muss ich nur noch dsld, multid, telefon, voipd,ctlmgr,websrv und multid reausschmeißen und es kann losgehen :-)
Mal schauen ob meine Anwendung jetzt läuft.
//EDIT:
Gute Nachricht:
Meine Anwendung läuft jetzt.
Schlechte Nachricht:
Ich weis jetzt nicht mehr wie ich die serielle Console abschalten kann, da ich in Freetz keine Option dafür gefunden hab.
Zudem giebt es eine Möglichkeit den Kernellog und den Bootloader von der Console fern zu halten ?
Ich hab schon bootserport in Adam2 auf tty1 umgestellt, hat aber nichts gebracht.
 
Im Freetz (zumindest im Trunk) kannst du unter Patches (Unterpunkt Misc patches) "Disable console on serial port" wählen.

Die Console im Bootloader dürfte nicht weg zu bekommen sein (sofern du den Bootloader slbst nicht "umpatchen" kannst, wobei ich nicht weiß, ob/wie das ginge). Das ist ja quasi der "Airbaig" der Box, wenn sie "verkonfiguriert" ist...
 
Ja dass es die Version im Trunk giebt weis ich aber in der 1.1.5 stable habs ich nicht gefunden.
Einen "Airbag" brauche ich aber nicht, denn im schlimmsten fall könnte ich die Box ja via EJTAG wieder herstellen.
Mal schauen, werd mir da eh bald einen adapter für bauen und ein wenig rumbasteln.
Der Bootloader ist ja (zumindest ohne die AVM mods) Opensource, sodass man ihn notfalls selber bauen könnte.
hab mir auch schon was anderes Überlegt, und zwar dass ich nur die Console abschalte und einen Transistor in die Sendeleitung hänge, denn ich dann mit einem LED Ausgang verbinde und so die Sendeleitung quasi "abschalte". Das sollte zwar mit recht wenig Hardware machbar sein, die modifikation des kernels und bootloaders aber die "professionellere".
Wie ich den Kernel ruhig krieg hab ich rausgekriegt, häng ich an die kernel_args ein "console=ttyS0,38400n8r" an so ist er zwar ruhig, leider jedoch so ruhig, dass er nach dem Starting Linux einfach stehen bleibt und erst nach einiger zeit neustartet.
 
Ein "console=/dev/null" sollte "ruhiger sein" ;-)

Ansonsten der "Inhalt" des Patches:
Code:
joerg@joerg-desktop:~/freetz-trunk$ cat patches/110-inittab.sh
if isFreetzType 7320 7330; then
	console="/dev/ttyS1" # 7320 uses ttyS1 as serial console
else
	console="/dev/ttyS0"
fi

# Do not start the shell if it should be disabled
[ "$FREETZ_DISABLE_SERIAL_CONSOLE" == "y" ] && shell="" || shell="-/bin/sh"

# Start Freetz IP watchdog if selected
[ "$FREETZ_REPLACE_ONLINECHANGED" == "y" ] && ip_watchdog="
# Freetz replacement for unreliable AVM onlinechanged
::respawn:/sbin/ip_watchdog
"

cat << EOF > "${FILESYSTEM_MOD_DIR}/etc/inittab"
#
::restart:/sbin/init
::sysinit:/etc/init.d/rc.S

# Start an "askfirst" shell on the console (whatever that may be)
$console::askfirst:$shell
$ip_watchdog
# Stuff to do before rebooting
::shutdown:/bin/sh -c /etc/inittab.shutdown

EOF
 
Ein "console=/dev/null" sollte "ruhiger sein" ;-)
hat nichts gebracht, er spuckt trotzdem alles aus, ich bin mitlerweile schon eine ganze Liste durch:
-tty
-tty0
-none
-/dev/null
-null
Zeigen alle keine Wirkung, das einzige was wirkt ist ttyS1, aber das bringt die Box zum absturz.
Langsam gehen mir die Ideen aus.
 
Also den Kernel hab ich jetzt ruhig gestellt, indem ich den Support für eine Seriele Konsole aus der Config des Kernels raushab.
Jetzt stört nur noch der Bootloader, da dessen ausgabe aber immer gleich ist könnte ich diese erstens überprüfen (mein Protkoll erfordert bestimmte Bytefolgen) und zweitens rausfiltern.
 
Kostenlos!

Statistik des Forums

Themen
248,914
Beiträge
2,304,893
Mitglieder
378,623
Neuestes Mitglied
mwsss