AirportExpress/64-bit

From Segfault
Jump to navigation Jump to search

On 64-bit Linux, the following issues were encountered.

64-bit binary

The executable could be built, but crashed when being used:

$ file raop_play/raop_play
raop_play/raop_play: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=4dc54d26fd5646b2c569dc8df737b7dc24857e8b, not stripped
$ gdb raop_play/raop_play 
(gdb) run ae /tmp/a.mp3
Starting program: /usr/local/src/raop-play-git/raop_play/raop_play/raop_play ae /tmp/a.mp3
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
DBG: Server: AirTunes/105.1
DBG: CSeq: 1
DBG: Apple-Response: PKrjBiRlILbamOV+nuY2039CjkZn/ScRX5pWTTseYwlB0ZZpW2jTJsmqqUTNcTnuLHfHsBOhTZP92e2jGcOc78bYv/AHQdLiJPhw34uIgJa9DIyKLE50iiMj12KDdzXbAjR8CUxDFu2s6SOuXnLjw4Est8fHjPiRpAWtRrvl4zhS9xANM+JdwMKHkfOD15iJbVPE3A2EQyuIsiCqOkFEBnnDWT/aX5tOYNeAIYkSH34X+vIngEnvaFu4ELCXLiYYsUD7MhY6n/3Dt0cceyk0I4wkmi0yIz+w2Mh06nh/jmU1PV8QaxvbG+O6/qoDntrZMXjEFZZHk1CAFePHlgIGXQ==
DBG: Transport: RTP/AVP/TCP;unicast;mode=record;server_port=6000
DBG: Session: 1
DBG: Audio-Jack-Status: connected; type=analog
DBG: Server: AirTunes/105.1
DBG: CSeq: 2
DBG: Audio-Latency: 4384
DBG: Server: AirTunes/105.1
DBG: CSeq: 3
DBG: Server: AirTunes/105.1
DBG: CSeq: 4
connected
DBG: audio data type: 3
DBG: id3 tagsize: 0
DBG: sample rate=44100

Program received signal SIGSEGV, Segmentation fault.
__memcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:33
33      ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S: No such file or directory.

(gdb) bt full
#0  __memcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:33
No locals.
#1  0x0000000000403885 in raopcl_send_sample (p=0x6192f0, sample=0x1 <error: Cannot access memory at address 0x1>, count=4255469) at raop_client.c:262
        rval = -1
        len = 61177
        header = "$\000\000\000\360\377\000\000\000\000\000\000\000\000\000"
        header_size = 16
        raopcld = 0x6192f0
        __func__ = "raopcl_send_sample"
#2  0x0000000000402d52 in main (argc=3, argv=0x7fffffffe168) at raop_play.c:267
        host = 0x7fffffffe4d4 "ae"
        fname = 0x7fffffffe4d7 "/tmp/a.mp3"
        port = 5000
        rval = 0
        i = 4
        size = 4255469
        volume = 100
        buf = 0x1 <error: Cannot access memory at address 0x1>
        iact = 0
        act = {__sigaction_handler = {sa_handler = 0x402799 <sig_action>, sa_sigaction = 0x402799 <sig_action>}, sa_mask = {__val = {0 <repeats 16 times>}}, 
          sa_flags = 4, sa_restorer = 0x7c}

32-bit binary

On this Debian/jessie system (amd64), the following packages needed to be installed:

sudo apt-get install libssl-dev:i386 libfltk1.3:i386 libsamplerate-dev:i386 libid3tag0-dev:i386 libid3tag0:i386 libfltk1.3-dev:i386

Add -m32 to CFLAGS:

diff --git a/raop_play/raop_play/Makefile.in b/raop_play/raop_play/Makefile.in
index 4fa69fc..9173204 100644
--- a/raop_play/raop_play/Makefile.in
+++ b/raop_play/raop_play/Makefile.in
@@ -12,7 +12,7 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 TARGET=raop_play
 DESTDIR =
 
-CFLAGS=-Wall
+CFLAGS=-Wall -m32 -g
 OBJS := raop_play.o raop_client.o rtsp_client.o aexcl_lib.o base64.o aes.o m4a_stream.o \
 audio_stream.o wav_stream.o mp3_stream.o flac_stream.o ogg_stream.o aac_stream.o pls_stream.o \
 pcm_stream.o flac_stream.o
@@ -20,7 +20,7 @@ pcm_stream.o flac_stream.o
 all: $(TARGET)
 
 raop_play: $(OBJS)
-       $(CC) -o $@  -lssl -lsamplerate -lid3tag $^
+       $(CC) -m32 -g -o $@ @LIBS@ $^
 
 install:
        $(mkinstalldirs) $(DESTDIR)$(bindir)/

Configure & build with:

CFLAGS="-g -m32" LIBS="-lcrypto" ./configure --prefix=/opt/raop-play
make -C raop_play 

Now we have a 32-bit executable:

$ file raop_play/raop_play

raop_play/raop_play: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=509904c24823023628477b8842316114b18d1ea3, not stripped

$ gdb raop_play/raop_play
 (gdb) run ae /tmp/a.mp3 
Starting program: /usr/local/src/raop-play-git/raop_play/raop_play/raop_play ae /tmp/a.mp3
DBG: Server: AirTunes/105.1
DBG: CSeq: 1
DBG: Apple-Response: O+2pG8bTI6izPMjbyK4qtO9oIQPZZae9nYpPxuYomk0Q4gWlSjW29nd/mUty7XZXjhb9Ynp3erxuXUP5N0oG/CHmHbJ56/rDhP6xYvpYskadZVvAvHqoQQBBpsWEWhPMReH8I/Lt03V9qAbLuYLq3SeGxxhdU8+75OPABkr7jF68N8mOgfR1tNX9YWSZ/xdMJWQBIHwREeYlNCZJ9ghfGS6SF443FnmmVVSxN+ZcXPqTIH9iweXprAQd6DJgO/R3B0YqC4mADJ4/a7KHma3RrXja5Uywabq/PcAmKE3OTAG/HncEKnFTAo/zQdIPf8LiEXc8ga1touLRhQon2Spq4g==
DBG: Transport: RTP/AVP/TCP;unicast;mode=record;server_port=6000
DBG: Session: 1
DBG: Audio-Jack-Status: connected; type=analog
DBG: Server: AirTunes/105.1
DBG: CSeq: 2
DBG: Audio-Latency: 4384
DBG: Server: AirTunes/105.1
DBG: CSeq: 3
DBG: Server: AirTunes/105.1
DBG: CSeq: 4
connected
DBG: audio data type: 3
DBG: id3 tagsize: 0
DBG: sample rate=44100

Program received signal SIGSEGV, Segmentation fault.
0xf7b0ecdc in memcpy () from /lib/i386-linux-gnu/libc.so.6

(gdb) bt full
#0  0xf7b0ecdc in memcpy () from /lib/i386-linux-gnu/libc.so.6
No symbol table info available.
#1  0x0804abf1 in raopcl_send_sample (p=0x805b058, sample=0x8048f95 <_init+9> "\201", <incomplete sequence \341>, count=-138344480) at raop_client.c:262
        rval = -1
        len = 2028
        header = "$\000\000\000\360\377\000\000\000\000\000\000\000\000\000"
        header_size = 16
        raopcld = 0x805b058
        __func__ = "raopcl_send_sample"
#2  0x0804a256 in main (argc=3, argv=0xffffd2e4) at raop_play.c:267
        host = 0xffffd4d4 "ae"
        fname = 0xffffd4d7 "/tmp/a.mp3"
        port = 5000
        rval = 0
        i = 4
        size = -138344480
        volume = 100
        buf = 0x8048f95 <_init+9> "\201", <incomplete sequence \341>
        iact = 0
        act = {__sigaction_handler = {sa_handler = 0x8049d45 <sig_action>, sa_sigaction = 0x8049d45 <sig_action>}, sa_mask = {__val = {0 <repeats 32 times>}}, 
          sa_flags = 4, sa_restorer = 0xf7c477dd <OPENSSL_cpuid_setup+269>}