pabr / leansdr

Lightweight, portable software-defined radio
GNU General Public License v3.0
151 stars 40 forks source link

leansdr make embedded issue for plutosdr #24

Open ghost opened 4 years ago

ghost commented 4 years ago

Hi I was installing leansdr and I included the binaries for libiio and the make step went through.

But when I do make embedded I get the following error.

$ make embedded g++ -O3 -I.. -DVERSION=\"leansdr-1.2.0-27-ge6416aa\" -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -Ilibiio leaniiorx.cc -lfftw3f -lpthread -Llibiio -L. -liio -lpthread -lxml2 -lz -llzma -static -o leaniiorx.x86_64 /usr/bin/ld: cannot find -liio collect2: error: ld returned 1 exit status Makefile:83: recipe for target 'leaniiorx.x86_64' failed make: *** [leaniiorx.x86_64] Error 1

Output of $ ld -liio --verbose

GNU ld (GNU Binutils for Ubuntu) 2.26.1 Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe using internal linker script:

/ Script for -z combreloc: combine and sort reloc sections / / Copyright (C) 2014-2015 Free Software Foundation, Inc. Copying and distribution of this script, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. / OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") OUTPUT_ARCH(i386:x86-64) ENTRY(_start) SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib"); SECTIONS { / Read-only sections, merged into text segment: / PROVIDE (executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS; .interp : { (.interp) } .note.gnu.build-id : { (.note.gnu.build-id) } .hash : { (.hash) } .gnu.hash : { (.gnu.hash) } .dynsym : { (.dynsym) } .dynstr : { (.dynstr) } .gnu.version : { (.gnu.version) } .gnu.version_d : { (.gnu.version_d) } .gnu.version_r : { (.gnu.version_r) } .rela.dyn : { (.rela.init) (.rela.text .rela.text. .rela.gnu.linkonce.t.) (.rela.fini) (.rela.rodata .rela.rodata. .rela.gnu.linkonce.r.) (.rela.data .rela.data. .rela.gnu.linkonce.d.) (.rela.tdata .rela.tdata. .rela.gnu.linkonce.td.) (.rela.tbss .rela.tbss. .rela.gnu.linkonce.tb.) (.rela.ctors) (.rela.dtors) (.rela.got) (.rela.bss .rela.bss. .rela.gnu.linkonce.b.) (.rela.ldata .rela.ldata. .rela.gnu.linkonce.l.) (.rela.lbss .rela.lbss. .rela.gnu.linkonce.lb.) (.rela.lrodata .rela.lrodata. .rela.gnu.linkonce.lr.) (.rela.ifunc) } .rela.plt : { (.rela.plt) PROVIDE_HIDDEN (__rela_iplt_start = .); (.rela.iplt) PROVIDE_HIDDEN (rela_iplt_end = .); } .init : { KEEP ((SORT_NONE(.init))) } .plt : { (.plt) (.iplt) } .plt.got : { (.plt.got) } .plt.bnd : { (.plt.bnd) } .text : { (.text.unlikely .text._unlikely .text.unlikely.) (.text.exit .text.exit.) (.text.startup .text.startup.) (.text.hot .text.hot.) (.text .stub .text. .gnu.linkonce.t.) / .gnu.warning sections are handled specially by elf32.em. / (.gnu.warning) } .fini : { KEEP ((SORT_NONE(.fini))) } PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .rodata : { (.rodata .rodata. .gnu.linkonce.r.) } .rodata1 : { (.rodata1) } .eh_frame_hdr : { (.eh_frame_hdr) (.eh_frame_entry .eh_frame_entry.) } .eh_frame : ONLY_IF_RO { KEEP ((.eh_frame)) (.eh_frame.) } .gcc_except_table : ONLY_IF_RO { (.gcc_except_table .gcc_except_table.) } .gnu_extab : ONLY_IF_RO { (.gnu_extab) } / These sections are generated by the Sun/Oracle C++ compiler. / .exception_ranges : ONLY_IF_RO { (.exception_ranges .exception_ranges) } / Adjust the address for the data segment. We want to adjust up to the same address within the page on the next page up. / . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); / Exception handling / .eh_frame : ONLY_IF_RW { KEEP ((.eh_frame)) (.eh_frame.) } .gnu_extab : ONLY_IF_RW { (.gnu_extab) } .gcc_except_table : ONLY_IF_RW { (.gcc_except_table .gcc_except_table.) } .exception_ranges : ONLY_IF_RW { (.exception_ranges .exception_ranges) } / Thread Local Storage sections / .tdata : { (.tdata .tdata. .gnu.linkonce.td.) } .tbss : { (.tbss .tbss. .gnu.linkonce.tb.) (.tcommon) } .preinit_array : { PROVIDE_HIDDEN (preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE_HIDDEN (preinit_array_end = .); } .init_array : { PROVIDE_HIDDEN (init_array_start = .); KEEP ((SORT_BY_INIT_PRIORITY(.init_array.) SORT_BY_INIT_PRIORITY(.ctors.))) KEEP ((.init_array EXCLUDE_FILE (crtbegin.o crtbegin?.o crtend.o crtend?.o ) .ctors)) PROVIDE_HIDDEN (init_array_end = .); } .fini_array : { PROVIDE_HIDDEN (fini_array_start = .); KEEP ((SORT_BY_INIT_PRIORITY(.fini_array.) SORT_BY_INIT_PRIORITY(.dtors.))) KEEP ((.fini_array EXCLUDE_FILE (crtbegin.o crtbegin?.o crtend.o crtend?.o ) .dtors)) PROVIDE_HIDDEN (fini_array_end = .); } .ctors : { / gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. / KEEP (crtbegin.o(.ctors)) KEEP (crtbegin?.o(.ctors)) / We don't want to include the .ctor section from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last / KEEP ((EXCLUDE_FILE (crtend.o crtend?.o ) .ctors)) KEEP ((SORT(.ctors.))) KEEP ((.ctors)) } .dtors : { KEEP (crtbegin.o(.dtors)) KEEP (crtbegin?.o(.dtors)) KEEP ((EXCLUDE_FILE (crtend.o crtend?.o ) .dtors)) KEEP ((SORT(.dtors.))) KEEP ((.dtors)) } .jcr : { KEEP ((.jcr)) } .data.rel.ro : { (.data.rel.ro.local .gnu.linkonce.d.rel.ro.local.) (.data.rel.ro .data.rel.ro. .gnu.linkonce.d.rel.ro.) } .dynamic : { (.dynamic) } .got : { (.got) (.igot) } . = DATA_SEGMENT_RELRO_END (SIZEOF (.got.plt) >= 24 ? 24 : 0, .); .got.plt : { (.got.plt) (.igot.plt) } .data : { (.data .data. .gnu.linkonce.d.) SORT(CONSTRUCTORS) } .data1 : { (.data1) } _edata = .; PROVIDE (edata = .); . = .; __bss_start = .; .bss : { (.dynbss) (.bss .bss. .gnu.linkonce.b.) (COMMON) / Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. FIXME: Why do we need it? When there is no .bss section, we don't pad the .data section. / . = ALIGN(. != 0 ? 64 / 8 : 1); } .lbss : { (.dynlbss) (.lbss .lbss. .gnu.linkonce.lb.) (LARGE_COMMON) } . = ALIGN(64 / 8); . = SEGMENT_START("ldata-segment", .); .lrodata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : { (.lrodata .lrodata. .gnu.linkonce.lr.) } .ldata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : { (.ldata .ldata. .gnu.linkonce.l.) . = ALIGN(. != 0 ? 64 / 8 : 1); } . = ALIGN(64 / 8); _end = .; PROVIDE (end = .); . = DATA_SEGMENT_END (.); / Stabs debugging sections. / .stab 0 : { (.stab) } .stabstr 0 : { (.stabstr) } .stab.excl 0 : { (.stab.excl) } .stab.exclstr 0 : { (.stab.exclstr) } .stab.index 0 : { (.stab.index) } .stab.indexstr 0 : { (.stab.indexstr) } .comment 0 : { (.comment) } / DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. / / DWARF 1 / .debug 0 : { (.debug) } .line 0 : { (.line) } / GNU DWARF 1 extensions / .debug_srcinfo 0 : { (.debug_srcinfo) } .debug_sfnames 0 : { (.debug_sfnames) } / DWARF 1.1 and DWARF 2 / .debug_aranges 0 : { (.debug_aranges) } .debug_pubnames 0 : { (.debug_pubnames) } / DWARF 2 / .debug_info 0 : { (.debug_info .gnu.linkonce.wi.) } .debug_abbrev 0 : { (.debug_abbrev) } .debug_line 0 : { (.debug_line .debug_line. .debug_line_end ) } .debug_frame 0 : { (.debug_frame) } .debug_str 0 : { (.debug_str) } .debug_loc 0 : { (.debug_loc) } .debug_macinfo 0 : { (.debug_macinfo) } / SGI/MIPS DWARF 2 extensions / .debug_weaknames 0 : { (.debug_weaknames) } .debug_funcnames 0 : { (.debug_funcnames) } .debug_typenames 0 : { (.debug_typenames) } .debug_varnames 0 : { (.debug_varnames) } / DWARF 3 / .debug_pubtypes 0 : { (.debug_pubtypes) } .debug_ranges 0 : { (.debug_ranges) } / DWARF Extension. / .debug_macro 0 : { (.debug_macro) } .gnu.attributes 0 : { KEEP ((.gnu.attributes)) } /DISCARD/ : { (.note.GNU-stack) (.gnudebuglink) *(.gnu.lto*) } }

================================================== attempt to open //usr/local/lib/x86_64-linux-gnu/libiio.so failed attempt to open //usr/local/lib/x86_64-linux-gnu/libiio.a failed attempt to open //lib/x86_64-linux-gnu/libiio.so failed attempt to open //lib/x86_64-linux-gnu/libiio.a failed attempt to open //usr/lib/x86_64-linux-gnu/libiio.so succeeded -liio (//usr/lib/x86_64-linux-gnu/libiio.so) librt.so.1 needed by //usr/lib/x86_64-linux-gnu/libiio.so found librt.so.1 at //lib/x86_64-linux-gnu/librt.so.1 libusb-1.0.so.0 needed by //usr/lib/x86_64-linux-gnu/libiio.so found libusb-1.0.so.0 at //lib/x86_64-linux-gnu/libusb-1.0.so.0 libxml2.so.2 needed by //usr/lib/x86_64-linux-gnu/libiio.so found libxml2.so.2 at //usr/lib/x86_64-linux-gnu/libxml2.so.2 libpthread.so.0 needed by //usr/lib/x86_64-linux-gnu/libiio.so found libpthread.so.0 at //lib/x86_64-linux-gnu/libpthread.so.0 libc.so.6 needed by //usr/lib/x86_64-linux-gnu/libiio.so found libc.so.6 at //lib/x86_64-linux-gnu/libc.so.6 libudev.so.1 needed by //lib/x86_64-linux-gnu/libusb-1.0.so.0 found libudev.so.1 at //lib/x86_64-linux-gnu/libudev.so.1 libdl.so.2 needed by //usr/lib/x86_64-linux-gnu/libxml2.so.2 found libdl.so.2 at //lib/x86_64-linux-gnu/libdl.so.2 libicuuc.so.55 needed by //usr/lib/x86_64-linux-gnu/libxml2.so.2 found libicuuc.so.55 at //usr/lib/x86_64-linux-gnu/libicuuc.so.55 libz.so.1 needed by //usr/lib/x86_64-linux-gnu/libxml2.so.2 found libz.so.1 at //lib/x86_64-linux-gnu/libz.so.1 liblzma.so.5 needed by //usr/lib/x86_64-linux-gnu/libxml2.so.2 found liblzma.so.5 at //lib/x86_64-linux-gnu/liblzma.so.5 libm.so.6 needed by //usr/lib/x86_64-linux-gnu/libxml2.so.2 found libm.so.6 at //lib/x86_64-linux-gnu/libm.so.6 ld-linux-x86-64.so.2 needed by //lib/x86_64-linux-gnu/libpthread.so.0 found ld-linux-x86-64.so.2 at //lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 libicudata.so.55 needed by //usr/lib/x86_64-linux-gnu/libicuuc.so.55 found libicudata.so.55 at //usr/lib/x86_64-linux-gnu/libicudata.so.55 libstdc++.so.6 needed by //usr/lib/x86_64-linux-gnu/libicuuc.so.55 found libstdc++.so.6 at //usr/lib/x86_64-linux-gnu/libstdc++.so.6 libgcc_s.so.1 needed by //usr/lib/x86_64-linux-gnu/libicuuc.so.55 found libgcc_s.so.1 at //lib/x86_64-linux-gnu/libgcc_s.so.1 ld: warning: cannot find entry symbol _start; not setting start address

ghost commented 4 years ago

Hi again

I am still stuck on the make embedded part. Some help would be appreciated.

The output for make embedded after generating the libiio.a file is g++ -O3 -I.. -DVERSION=\"leansdr-1.2.0-27-ge6416aa\" -Wall -Wno-sign-compare -Wno-array-bounds -Wno-unused-variable -Ilibiio leaniiorx.cc -lfftw3f -lpthread -Llibiio -L. -liio -lpthread -lxml2 -lz -llzma -static -o leaniiorx.x86_64 /usr/bin/ld: dynamic STT_GNU_IFUNC symbol strcmp' with pointer equality in/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie collect2: error: ld returned 1 exit status Makefile:83: recipe for target 'leaniiorx.x86_64' failed make: *** [leaniiorx.x86_64] Error 1

pabr commented 4 years ago

It looks like you are running "make embedded" on a x86_64 machine, so the Makefile is trying to generate a binary for x86_64. If this is really what you want, try the same command without "-static".

But leaniiorx is intended to run on-board the plutosdr. The Makefile can generate a portable (static) plutosdr binary if you run it on another arm-linux board (e.g. raspberry pi with some versions of the OS) with libiio already compiled, but that was a quick hack. The proper approach is documented at https://wiki.analog.com/university/tools/pluto/devs/embedded_code , but that's a lot more work.

You can also test leansdr binaries from leantrx to decide whether you really want to recompile the latest version. Download from https://www.pabr.org/radio/leantrx/leantrx.en.html#plutosdr_net_install

ghost commented 4 years ago

Hi

I solved it. I removed the previous installation and did a new clean install and everything worked. Thanks.

I have another question though, I want to use leandvb to offline decode the dvb-s2 I have pre-recorded. Now the data type I have is from Matlab using AD936x and its in double complex IQ. How can I convert it to the data type supported by leandvb.

I have the following formats I can receive the dvb-s2 in Matlab:

  1. int16 — Integer values are the raw 16-bit I and Q samples from the board. The 12-bit value from the ADC of the AD9361 RF chip is sign-extended to 16 bits.
  1. single — Single-precision floating point values are scaled to the range of [–0.0625, 0.0625]. The block derives this value from the sign-extended 16 bits received from the board.

  2. double — Double-precision floating point values are scaled to the range of [–0.0625, 0.0625]. The block derives this value from the sign-extended 16 bits received from the board.

I have been trying to convert using typecast but its not working. Thanks !

ghost commented 4 years ago

Also, is there a way I can integrate leandvb in my Matlab code? I am looking for a dvb s2 decoder.

pabr commented 4 years ago

Hopefully a Matlab expert will be able to answer your question. There's probably a way to write IQ data to a file in binary mode using "single" format ("Single-precision floating point values"), then execute leandvb from Matlab with a system() command, then read the resulting MPEG TS file.