BG95-M3 QuecOpen linker fail

Hello everyone,

I’m trying to port a project into BG95-M3 module using QuecOpen. I’m getting some linker errors and I don’t understand the reason. Here is my compilation output:

C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5>build_demo.bat llvm avior
== Cleaning Last Building ... bin
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\bin\oem_app_path.ini
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\bin\quectel_demo_avior.map
== Cleaning... quectel\example\build
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\avior_main.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\command.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\console_command.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\diag_mng.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\error.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\example_avior.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\inputmng.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\log.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\mail.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\mem.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\mqtt.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\nvs_utility.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\output.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\parse.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\phonebk.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\port_expander.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\quectel_uart_apis.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\quectel_utils.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\reqget.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\reset.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\rtu.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\rules.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\smm.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\txm_module_preamble_llvm.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\uart.o
File eliminato - C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel\example\build\utility.o
== Application RO base selected = 0x40000000
== Compiling .S file...
== Compiling .C file...
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\avior_main.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\command.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\console_command.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\diag_mng.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\error.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\example_avior.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\inputmng.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\log.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\mail.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\mem.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\mqtt.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\nvs_utility.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\output.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\parse.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\phonebk.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\port_expander.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel_uart_apis.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\quectel_utils.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\reqget.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\reset.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\rtu.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\rules.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\smm.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\uart.o
C:\Quectel_BG95\Quectel_BG95_QuecOpen_SDK_Package_V1.1.5\utility.o
       25 file spostato/i.
== Linking Example avior application
Target: armv7m-none--musleabi
Thread model: posix
Repository: (ssh://review-hexagon.quicinc.com:29418/llvm/clang-mainline 0d355f9234b0a44bd142f15655d20b06759c0965) (ssh://review-hexagon.quicinc.com:29418/llvm/llvm-mainline c956069add38e7cefbd266d7723df12179753aae)
Snapdragon LLVM ARM Compiler 4.0.3 (based on llvm.org 4.0+)
clang version 4.0.3
InstalledDir: C:\Quectel_BG95\LLVM\4.0.3\bin

Options for link job construction: --driver-mode=g++ -v -d -o bin\quectel_demo_avior.elf -target armv7m-none-musleabi -fuse-ld=qcld -lc++ -Wl,-mno-unaligned-access -fuse-baremetal-sysroot -fno-use-baremetal-crt -Wl,-entry=0x40000000 quectel\example\build\txm_module_preamble_llvm.o -Wl,-Tquectel\build\quectel_dam_demo.ld -Wl,-Map=bin\quectel_demo_avior.map,-gc-sections -Wl,-gc-sections quectel\example\build\avior_main.o quectel\example\build\command.o quectel\example\build\console_command.o quectel\example\build\diag_mng.o quectel\example\build\error.o quectel\example\build\example_avior.o quectel\example\build\inputmng.o quectel\example\build\log.o quectel\example\build\mail.o quectel\example\build\mem.o quectel\example\build\mqtt.o quectel\example\build\nvs_utility.o quectel\example\build\output.o quectel\example\build\parse.o quectel\example\build\phonebk.o quectel\example\build\port_expander.o quectel\example\build\quectel_uart_apis.o quectel\example\build\quectel_utils.o quectel\example\build\reqget.o quectel\example\build\reset.o quectel\example\build\rtu.o quectel\example\build\rules.o quectel\example\build\smm.o quectel\example\build\txm_module_preamble_llvm.o quectel\example\build\uart.o quectel\example\build\utility.o libs\azure_sdk.lib libs\azure_sdk_port.lib libs\diag_dam_lib.lib libs\qapi_psm_lib.lib libs\timer_dam_lib.lib libs\txm_lib.lib

 "C:\\Quectel_BG95\\LLVM\\4.0.3\\bin\\ld.qcld.exe" -X --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /lib/ld-musl-arm.so.1 -o "bin\\quectel_demo_avior.elf" -lc++ -mno-unaligned-access -entry=0x40000000 "quectel\\example\\build\\txm_module_preamble_llvm.o" "-Tquectel\\build\\quectel_dam_demo.ld" "-Map=bin\\quectel_demo_avior.map" -gc-sections -gc-sections "quectel\\example\\build\\avior_main.o" "quectel\\example\\build\\command.o" "quectel\\example\\build\\console_command.o" "quectel\\example\\build\\diag_mng.o" "quectel\\example\\build\\error.o" "quectel\\example\\build\\example_avior.o" "quectel\\example\\build\\inputmng.o" "quectel\\example\\build\\log.o" "quectel\\example\\build\\mail.o" "quectel\\example\\build\\mem.o" "quectel\\example\\build\\mqtt.o" "quectel\\example\\build\\nvs_utility.o" "quectel\\example\\build\\output.o" "quectel\\example\\build\\parse.o" "quectel\\example\\build\\phonebk.o" "quectel\\example\\build\\port_expander.o" "quectel\\example\\build\\quectel_uart_apis.o" "quectel\\example\\build\\quectel_utils.o" "quectel\\example\\build\\reqget.o" "quectel\\example\\build\\reset.o" "quectel\\example\\build\\rtu.o" "quectel\\example\\build\\rules.o" "quectel\\example\\build\\smm.o" "quectel\\example\\build\\txm_module_preamble_llvm.o" "quectel\\example\\build\\uart.o" "quectel\\example\\build\\utility.o" "libs\\azure_sdk.lib" "libs\\azure_sdk_port.lib" "libs\\diag_dam_lib.lib" "libs\\qapi_psm_lib.lib" "libs\\timer_dam_lib.lib" "libs\\txm_lib.lib" "-LC:\\Quectel_BG95\\LLVM\\4.0.3\\armv7m-none-eabi\\libc\\lib" "-LC:\\Quectel_BG95\\LLVM\\4.0.3\\armv7m-none-eabi\\lib" --start-group -lunwind -lc++ -lc++abi --end-group "-LC:\\Quectel_BG95\\LLVM\\4.0.3\\lib\\clang\\4.0.3\\lib\\baremetal" --start-group -lc -lclang_rt.builtins-armv7m --end-group -lm -lc
Error: libs\azure_sdk_port.lib(.text.platform_get_platform_info+0xc): undefined reference to `STRING_construct'
Error: libs\azure_sdk_port.lib(.text.Thread_Init+0x18): undefined reference to `singlylinkedlist_create'
Error: libs\azure_sdk_port.lib(.text.Thread_Init+0x910): undefined reference to `singlylinkedlist_destroy'
Error: libs\azure_sdk_port.lib(.text.Thread_Manager+0x1d0): undefined reference to `singlylinkedlist_get_head_item'
Error: libs\azure_sdk_port.lib(.text.Thread_Manager+0x1f0): undefined reference to `singlylinkedlist_item_get_value'
Error: libs\azure_sdk_port.lib(.text.Thread_Manager+0x370): undefined reference to `singlylinkedlist_remove'
Error: libs\azure_sdk_port.lib(.text.Thread_Manager+0x38c): undefined reference to `singlylinkedlist_get_next_item'
Error: libs\azure_sdk_port.lib(.text.ThreadAPI_Create+0x54c): undefined reference to `singlylinkedlist_add'
Error: libs\azure_sdk_port.lib(.text.ThreadAPI_Exit+0xd8): undefined reference to `singlylinkedlist_find'
Error: libs\azure_sdk_port.lib(.text.ThreadAPI_Exit+0x218): undefined reference to `singlylinkedlist_item_get_value'
Error: libs\azure_sdk_port.lib(.text.Thread_Find+0x60): undefined reference to `singlylinkedlist_item_get_value'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_retrieve_options+0x230): undefined reference to `OptionHandler_Create'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_retrieve_options+0x358): undefined reference to `OptionHandler_AddOption'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_retrieve_options+0x478): undefined reference to `OptionHandler_AddOption'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_retrieve_options+0x584): undefined reference to `OptionHandler_AddOption'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_retrieve_options+0x690): undefined reference to `OptionHandler_AddOption'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_retrieve_options+0x890): undefined reference to `OptionHandler_Destroy'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_create+0x464): undefined reference to `strcpy_s'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_create+0x56c): undefined reference to `mallocAndStrcpy_s'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_setoption+0x3d0): undefined reference to `mallocAndStrcpy_s'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_setoption+0x66c): undefined reference to `mallocAndStrcpy_s'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_setoption+0x890): undefined reference to `strcpy_s'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_clone_option+0x264): undefined reference to `mallocAndStrcpy_s'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_clone_option+0x3a0): undefined reference to `mallocAndStrcpy_s'
Error: libs\azure_sdk_port.lib(.text.tlsio_qcom_threadx_clone_option+0x4dc): undefined reference to `mallocAndStrcpy_s'
Fatal: Linking had errors.
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
usage: llvm-elf-to-hex.py [-h] (--vhx | --m32combined | --i32combined | --bin)
                          [--8x1 | --8x2 | --8x4 | --16x1 | --16x2 | --32x1 | --32x2 | --64x1]
                          --output OUTPUT [--verbose]
                          input_elf
llvm-elf-to-hex.py: error: argument input_elf: can't open 'bin\quectel_demo_avior.elf': [Errno 2] No such file or directory: 'bin\\quectel_demo_avior.elf'
== Demo application is built in bin
Done.

Could it be caused by using some “standand” C function such as “fopen” or “malloc”?

Thanks in advance!

unistd and FILE is not supported ( or retarget newlib )
for memory - create global heap and retarget malloc free

example:

void *malloc(size_t size)
{
void *ptr = NULL;
return (size && (0 == tx_byte_allocate(gHeap, (void **)&ptr, size, TX_NO_WAIT))) ? ptr : NULL;
}

Thanks @WizIO.

I have to learn and study threadX framework a lot!!

Regards