Fritz-Asterisk zum selber kompilieren?

Hallo,
ich habe scheitere gerade auch daran, Asterisk 1.6.2.8 für meine FritzBox 7270 (freetz-trunk) zu kompilieren. Das Cross-Compiling funktioniert soweit auch, das Binary lässt sich auf der FritzBox aufrufen, aber er stürzt sofort mit folgender Fehlermeldung ab:

Code:
: can't resolve symbol 'ast_module_register'

Kann sich irgendjemand einen Reim darauf machen, was das zu heißen hat, und in welcher Richtung ich den Fehler suchen muss?
Der Asterisk ist statisch kompiliert, d.h. an irgendwelchen Libraries kann es eigentlich nicht liegen. Für mich hört sich das so an, als ob der Asterisk eine seiner eigenen Funktionen nicht finden würde. Aber das macht doch irgendwie keinen Sinn.

Ich bin für jeden Tipp dankbar.

Gruß
David
 
Hattest recht, das war in der Tat ein Fehler. Aber so richtig funktionieren will es trotzdem nicht. Jetzt steigt er mir mit einem SegFault aus. :(
Code:
/var/media/ftp/uStor01/asterisk # sbin/asterisk -f
[Jun 13 11:46:52] WARNING[22325]: res_phoneprov.c:928 set_config: Unable to load users.conf
[Jun 13 11:46:53] WARNING[22325]: app_followme.c:314 reload_followme: No follow me config file (followme.conf), so no follow me
[Jun 13 11:46:55] WARNING[22325]: app_minivm.c:2620 load_config: Failed to load configuration file. Module activated with default settings.
[Jun 13 11:46:55] WARNING[22325]: utils.c:1536 __ast_string_field_init: trying to reset empty pool
[Jun 13 11:46:56] ERROR[22325]: ael.y:840 ael_yyerror: ==== File: (null), Line 1, Cols: 0-0: Error: syntax error, unexpected $end, expecting 'context'
[Jun 13 11:46:56] ERROR[22325]: pbx_ael.c:151 pbx_load_module: Sorry, but 1 syntax errors and 0 semantic errors were detected. It doesn't make sense to compile.
[Jun 13 11:46:56] ERROR[22325]: res_clialiases.c:186 load_config: res_clialiases configuration file 'cli_aliases.conf' not found
[Jun 13 11:46:57] WARNING[22325]: translate.c:654 __ast_register_translator: plc_samples 160 format f
Segmentation fault
 
Der einzige Error geht darauf zurück, dass ich keine extensions.ael habe, und er diese somit nicht parsen kann. Wenn ich das AEL-Modul deaktiviere, bleibt auch diese Fehlermeldung weg. Dürfte also nichts mit den Meldungen zu tun haben.
Interessant ist, dass der Asterisk läuft, wenn ich ihn ganz ohne Module starte. Entweder durch eine leere modules.conf, oder auch wenn ich die Anweisung autoload in der modules.conf entferne. Es scheint also irgendein Modul zu geben, dass beim Laden Probleme macht. Muss ich mal schauen, wie ich den Fehler einschränken kann.
 
So ein Problem hatte ich auch.
Bei mir lief asterisk nur, wenn ich es mit Asterisk -v gestartet hatte.
 
Es ist wirklich seltsam. Es spielt übrigens auch keine Rolle, ob ich Asterisk 1.4 oder 1.6 nehme, das selbe Bild.

Wenn ich den Asterisk mit -v und Debug starte, erhalte ich folgende Ausgabe:

Code:
Asterisk 1.4.32, Copyright (C) 1999 - 2010 Digium, Inc. and others.
Created by Mark Spencer <[email protected]>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Set to realtime thread
Asterisk Event Logger Started /var/media/ftp/uStor01/asterisk/var/log/asterisk/event_log
Asterisk Dynamic Loader Starting:
res_features.so => (Call Features Resource)
codec_alaw.so => (A-law Coder/Decoder)
Asterisk PBX Core Initializing
Registering builtin applications:
 [Answer]
 [BackGround]
 [Busy]
 [Congestion]
 [Goto]
 [GotoIf]
 [GotoIfTime]
 [ExecIfTime]
 [Hangup]
 [NoOp]
 [Progress]
 [ResetCDR]
 [Ringing]
 [SayNumber]
 [SayDigits]
 [SayAlpha]
 [SayPhonetic]
 [SetAMAFlags]
 [SetGlobalVar]
 [Set]
 [ImportVar]
 [Wait]
 [WaitExten]
Asterisk Dynamic Loader Starting:
format_jpeg.so => (JPEG (Joint Picture Experts Group) Image Format)
format_ilbc.so => (Raw iLBC data)
format_wav_gsm.so => (Microsoft WAV format (Proprietary GSM))
format_g723.so => (G.723.1 Simple Timestamp File Format)
format_h264.so => (Raw H.264 data)
format_g726.so => (Raw G.726 (16/24/32/40kbps) data)
format_sln.so => (Raw Signed Linear Audio support (SLN))
format_pcm.so => (Raw/Sun uLaw/ALaw 8KHz (PCM,PCMA,AU), G.722 16Khz)
format_h263.so => (Raw H.263 data)
format_vox.so => (Dialogic VOX (ADPCM) File Format)
format_gsm.so => (Raw GSM data)
format_wav.so => (Microsoft WAV format (8000Hz Signed Linear))
format_g729.so => (Raw G729 data)
res_monitor.so => (Call Monitoring Resource)
res_speech.so => (Generic Speech Recognition API)
res_agi.so => (Asterisk Gateway Interface (AGI))
res_adsi.so => (ADSI Resource)
pbx_loopback.so => (Loopback Switch)
app_amd.so => (Answering Machine Detection Application)
app_speech_utils.so => (Dialplan Speech Applications)
app_alarmreceiver.so => (Alarm Receiver for Asterisk)
app_random.so => (Random goto)
app_controlplayback.so => (Control Playback Application)
app_readfile.so => (Stores output of file into a variable)
Segmentation fault

Wenn ich nun zum Spaß einfach alle Module per noload deaktiviere, erhalte ich folgendes:
Code:
Asterisk 1.4.32, Copyright (C) 1999 - 2010 Digium, Inc. and others.
Created by Mark Spencer <[email protected]>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Parsing /var/media/ftp/uStor01/asterisk/etc/asterisk/asterisk.conf
Set to realtime thread
Parsing /var/media/ftp/uStor01/asterisk/etc/asterisk/extconfig.conf
Parsing /var/media/ftp/uStor01/asterisk/etc/asterisk/logger.conf
Asterisk Event Logger Started /var/media/ftp/uStor01/asterisk/var/log/asterisk/event_log
Asterisk Dynamic Loader Starting:
Asterisk PBX Core Initializing
Registering builtin applications:
 [Answer]
 [BackGround]
 [Busy]
 [Congestion]
 [Goto]
 [GotoIf]
 [GotoIfTime]
 [ExecIfTime]
 [Hangup]
 [NoOp]
 [Progress]
 [ResetCDR]
 [Ringing]
 [SayNumber]
 [SayDigits]
 [SayAlpha]
 [SayPhonetic]
 [SetAMAFlags]
 [SetGlobalVar]
 [Set]
 [ImportVar]
 [Wait]
 [WaitExten]
Asterisk Dynamic Loader Starting:
Segmentation fault

Es scheint also nicht irgendein bestimmtes Modul zu sein, was nicht funktioniert, sondern der Modul-Loader als solches. Seltsam, dabei lief mit meinem letzten Freetz-Trunk (rev.3449) noch alles ohne Probleme. Irgendwas muss sich da geändert haben, was sich jetzt mit dem Asterisk beißt.
Ich werde es mal noch mit einem komplett statischen Build versuchen, ganz ohne Runtime module loading.
 
Juhu, Fehler gefunden, Problem gelöst, Asterisk rennt.
Das Sorgenkind war mal wieder die Kombination libcrypto & libssl.
Beim statischen Build hat mir der Linker in meiner Build-Umgebung endlich brauchbare Fehlermeldungen liefern können. Vermutlich war das auch die Ursache für die SegFaults auf der FritzBox, nur dass mit dort nicht die passenden Debug-Tools zur Verfügung stehen.
Ich habe den Asterisk 1.6 nun voll statisch kompiliert, ohne SSL und CURL. Das Binary ist nun über 40 MB groß - aber es funktioniert. :D Die gesamte Asterisk-Installation liegt sowieso auf einem an der FritzBox angeschlossenen GB USB-Stick, da ist mir die Dateigröße des Binaries eigentlich relativ egal.

Falls sich jemand für die Fehlermeldung interessiert, das spuckt mit der Linker ganz am Ende aus, wenn er versucht die libcrypto statisch in das Asterisk-Binary zu linken:

Code:
   [LD] abstract_jb.o acl.o adsistub.o aescrypt.o aeskey.o aestab.o alaw.o app.o ast_expr2.o ast_expr2f.o asterisk.o astfd.o astmm.o astobj2.o audiohook.o autoservice.o bridging.o callerid.o cdr.o channel.o chanvars.o cli.o config.o cryptostub.o datastore.o db.o devicestate.o dial.o dns.o dnsmgr.o dsp.o enum.o event.o features.o file.o fixedjitterbuf.o frame.o fskmodem.o global_datastores.o hashtab.o heap.o http.o image.o indications.o io.o jitterbuf.o loader.o logger.o manager.o md5.o netsock.o pbx.o plc.o poll.o privacy.o rtp.o say.o sched.o sha1.o slinfactory.o srv.o ssl.o stdtime/localtime.o strcompat.o strings.o taskprocessor.o tcptls.o tdd.o term.o threadstorage.o timing.o translate.o udptl.o ulaw.o utils.o version.o xml.o xmldoc.o editline/libedit.a db1-ast/libdb1.a ../apps/modules.link ../bridges/modules.link ../cdr/modules.link ../channels/modules.link ../codecs/modules.link ../formats/modules.link ../funcs/modules.link ../pbx/modules.link ../res/modules.link -> asterisk
/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
dso_dlfcn.c:(.text+0x3f0): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x428): undefined reference to `dlerror'
/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
dso_dlfcn.c:(.text+0x548): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x584): undefined reference to `dlerror'
/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload':
dso_dlfcn.c:(.text+0x688): undefined reference to `dlclose'
/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
dso_dlfcn.c:(.text+0x714): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x75c): undefined reference to `dlerror'
dso_dlfcn.c:(.text+0x7d0): undefined reference to `dlclose'
collect2: ld returned 1 exit status
make[1]: *** [asterisk] Error 1
make: *** [main] Error 2

SSL wäre zwar ein nettes Gimmick, benötige ich auf meinem Asterisk aber auch wieder nicht ganz dringend. Immerhin läuft jetzt wieder eine aktuelle Asterisk-Version, und das ist die Hauptsache. Da sie statisch kompiliert ist, dürfte sie wohl auch die ein oder andere Freetz bzw. uclibc o.ä. Änderung in der Zukunft überstehen. :)
 
Was heißt statisch? Es gibt nur eine einzige Datei, die "asterisk" heißt, keinerlei weitere Dateien wie /usr/lib/asterisk/modules/app_dial.so und man braucht auch kein libpthread?
 
Es gibt nur eine einzige Datei, die "asterisk" heißt, keinerlei weitere Dateien wie /usr/lib/asterisk/modules/app_dial.so und man braucht auch kein libpthread?
Im Prinzip schon, ja. Das Verzeichnis lib/asterisk/modules ist komplett leer. Irgendwelche weiteren Abhängigkeiten zu dynamischen Libraries dürften auch nicht bestehen, da mir das ldd aus der Freetz-Toolchain "not an ELF file" meldet. Somit konzentriert sich der gesamte Asterisk in einem einzigen (entsprechend großen) Binary. Nicht besonders elegant, u.U. aber auch vorteilhaft.
Code:
/var/media/ftp/uStor01/asterisk # ll lib/asterisk/modules/
drwxr-xr-x    2 root     root          4096 Jun 13 15:00 .
drwxr-xr-x    3 root     root          4096 Jun 13 15:01 ..
/var/media/ftp/uStor01/asterisk # ll sbin/
drwxr-xr-x    2 root     root          4096 Jun 13 15:03 .
drwxr-xr-x    9 root     root          4096 Jun 13 15:03 ..
-rwxr-xr-x    1 root     root       1872812 Jun 13 15:00 aelparse
-rwxr-xr-x    1 root     root         59283 Jun 13 15:00 astcanary
-rwxr-xr-x    1 root     root      46653853 Jun 13 15:00 asterisk
-rwxr-xr-x    1 root     root          1400 Jun 13 15:00 astgenkey
-rwxr-xr-x    1 root     root          5814 Jun 13 15:00 autosupport
-rwxr-xr-x    1 root     root       1881476 Jun 13 15:00 conf2ael
-rwxr-xr-x    1 root     root       1034556 Jun 13 15:00 hashtest
-rwxr-xr-x    1 root     root       1038936 Jun 13 15:00 hashtest2
-rwxr-xr-x    1 root     root        140029 Jun 13 15:00 muted
lrwxrwxrwx    1 root     root             8 Jun 13 15:01 rasterisk -> asterisk
-rwxr-xr-x    1 root     root       1028440 Jun 13 15:00 refcounter
-rwxr-xr-x    1 root     root          5519 Jun 13 15:00 safe_asterisk
-rwxr-xr-x    1 root     root        209947 Jun 13 15:00 smsq
-rwxr-xr-x    1 root     root        121011 Jun 13 15:00 stereorize
-rwxr-xr-x    1 root     root         75841 Jun 13 15:00 streamplayer
/var/media/ftp/uStor01/asterisk # du -s -k *
4       bin
144     etc
1284    include
12      lib
52992   sbin
32      share
197456  var

Der Speicherverbrauch sieht auch ganz ordentlich aus. Obwohl nun alle Modul statisch einkompiliert sind, begnügt sich der Asterisk mit 6,8 MB RAM.

Code:
/var/mod/root # top
Mem: 57080K used, 4220K free, 0K shrd, 7788K buff, 16328K cached
CPU:  12% usr  18% sys   0% nic  68% idle   0% io   0% irq   0% sirq
Load average: 0.22 0.15 0.14 2/107 4258
  PID  PPID USER     STAT   VSZ %MEM %CPU COMMAND
 4258  4222 root     R     1524   2%  31% top
  885     1 root     S N   9308  15%   0% ctlmgr
 1314  1312 root     S N   9308  15%   0% ctlmgr
 1312   885 root     S N   9308  15%   0% ctlmgr
 1313  1312 root     S N   9308  15%   0% ctlmgr
 1522  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1508     1 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1543  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1537  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1554  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1551  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1516  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1527  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1532  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1530  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1521  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1536  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1520  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1526  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
 1542  1510 root     S <   6848  11%   0% /var/media/ftp/uStor01/asterisk/sbin/a
/var/mod/root # free
              total         used         free       shared      buffers
  Mem:        61300        56968         4332            0         7804
 Swap:        65528            0        65528
Total:       126828        56968        69860
 
Also braucht man theoretisch gar kein Freetz und ich kann das binary auf einen USB-Stick tun, und per telnet in einer 7270er (mit orig. AVM Firmware) ausführen? Wenn ja, bitte ich um eine Kopie auf >meinnickim_ippf<ätwolke7.net :)
 
Zuletzt bearbeitet:
Code:
dso_dlfcn.c:(.text+0x714): undefined reference to `[B]dl[/B]open'
dso_dlfcn.c:(.text+0x75c): undefined reference to `[B]dl[/B]error'
dso_dlfcn.c:(.text+0x7d0): undefined reference to `[B]dl[/B]close'
wie die Fehlermeldung eigentlich schon sagt, fehlt libdl, diese muss dazu gelinkt werden (-ldl)
 
wie die Fehlermeldung eigentlich schon sagt, fehlt libdl, diese muss dazu gelinkt werden (-ldl)
Okay, klingt logisch, aber ich meine, dass ich das bereits getan habe.

Laut configure Script gibt es folgende Umgebungsvariablen:
Code:
Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>

Diese sind bei mir wie folgt gesetzt:
Code:
CC=/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc/bin/mipsel-linux-uclibc-gcc
CFLAGS=-Os -s
LDFLAGS=-L/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc/lib
LIBS=-ldl
CPPFLAGS=-I/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc/include

Die Fehlermeldung bleibt aber nach wie vor exakt die selbe. Dabei müsste die Variable LIBS doch eigentlich genau das machen, was du meintest (die libdl mit einbinden). Existieren tut die libdl in der Toolchain-Umgebung übrigens.

Hättest du noch einen Tipp für mich? Vielleicht mache ich auch irgendwo gerade einen Denkfehler beim Kompilieren, soo vertraut bin ich mit dieser Materie nämlich auch wieder nicht. Aber vielleicht kriegen wir's ja noch hin, ich bin optimistisch. ;)
 
Ich glaube, ich habe die richtige Stelle zufällig gefunden.
In der Datei 'makeopts' werden die Libraries angegeben, die für die OpenSSL-Unterstützung notwendig sind. Diese Zeile habe ich nun einfach um ' -ldl' ergänzt.
Code:
OPENSSL_LIB= -lssl -lcrypto [b]-ldl[/b]
Mit dem Ergebnis: Es funktioniert. Das Asterisk-Binary hat sich dadurch zwar auf mittlerweile 52 MB aufgebläht, aber somit wäre nun auch die OpenSSL-Lib statisch mit drin.

Wenn sich mit dieser Version bis zum Wochenende keine Auffälligkeiten zeigen, kann ich hier ja auch ein kleines Howto veröffentlichen, wie man ausgehend von einer funktionsfähigen Freetz Build-Umgebung sich selber seinen eigenen statischen Asterisk für den USB-Stick kompilieren kann. Wenn man weiß wie, ist's nämlich gar nicht so schwierig. :)
 
Code:
...kann ich hier ja auch ein kleines Howto veröffentlichen, 
wie man ausgehend von einer funktionsfähigen Freetz Build-Umgebung 
sich selber seinen eigenen statischen Asterisk für den USB-Stick 
kompilieren kann


Das wäre oberlieb.

Eine idiotensichere Anleitung wäre perfekt.
 
Zuletzt bearbeitet:
Hallo,
ein erster Entwurf meiner Anleitung ist nun online, hier im Forum unter folgender URL zu finden:
http://www.ip-phone-forum.de/showthread.php?t=217453

Eine ganz idiotensichere Anleitung ist mir damit sicherlich nicht gelungen. Aber vielleicht reicht es ja schon aus, um dem ein oder anderen hier weiterhelfen zu können.

Und außerdem: Was gibt es langweiligeres als Copy&Paste Howtos. :rolleyes:
 
Ja vielen Dank.
 
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.