Во моем встроенном проекте я компилирую amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.c
следующим образом:
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc \
-std=gnu11 \
-mcpu=cortex-m7 \
-mthumb \
-mapcs \
-mfloat-abi=hard \
-mfpu=fpv5-d16 \
-fno-common \
-fno-math-errno \
-fsingle-precision-constant \
-fno-trapping-math \
-fno-signaling-nans \
-fno-builtin \
-fstrict-aliasing \
-fstack-usage \
-Wstack-usage=300 \
-DCPU_MIMXRT1051DVL6B \
-D__FREERTOS__=1 \
-DFSL_RTOS_FREE_RTOS \
-DFSL_FEATURE_PHYKSZ8081_USE_RMII50M_MODE \
-D__MCUXPRESSO \
-D__USE_CMSIS \
-DARM_MATH_CM7 \
-D__NEWLIB__ \
-DDEBUG=0 \
-IDSP/source/ \
-Iamazon-freertos/lib/FreeRTOS-Plus-TCP/ \
-Iamazon-freertos/lib/FreeRTOS-Plus-TCP/portable/BufferManagement/ \
-Iamazon-freertos/lib/FreeRTOS-Plus-TCP/portable/NetworkInterface/imxrt105x/ \
-Iamazon-freertos/lib/FreeRTOS/ \
-Iamazon-freertos/lib/include/ \
-Iamazon-freertos/lib/FreeRTOS/portable/GCC/ARM_CM4F/ \
-Iamazon-freertos/lib/FreeRTOS/portable/MemMang/ \
-Og \
-g3 \
-Wall \
-ffunction-sections \
-fdata-sections \
-c \
-MMD \
-MP \
-Werror \
-D"ARCPRINTF( ... )=(void)0" \
--specs=nano.specs \
-Wa,-anhlmsd=build/DSP/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.lst \
-o build/DSP/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.o amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.c
У меня ipconfigUSE_TCP
установлен на 1 в amazon-freertos/lib/FreeRTOS-Plus-TCP/include/FreeRTOSIPConfig.h
FreeRTOS_Sockets.c
объявляет xBoundUDPSocketsList
и xBoundTCPSocketsList
/* The list that contains mappings between sockets and port numbers. Accesses
to this list must be protected by critical sections of one kind or another. */
List_t xBoundUDPSocketsList;
#if ipconfigUSE_TCP == 1
List_t xBoundTCPSocketsList;
#endif /* ipconfigUSE_TCP == 1 */
Как только у меня будет связанный исполняемый файл elf, запустите эту команду:
$ /opt/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-nm -a -l -n -t x --print-size image/DSP.elf | grep -E '^[[:xdigit:]]{8} [[:xdigit:]]{8} B' | grep SocketsList
2001ac7c 00000014 B xBoundTCPSocketsList
2001ac90 00000014 B xBoundUDPSocketsList /home/max/Lavori/4202/src/repos/toremove/FW/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.c:162
Оба символа существуют в исполняемом файле, но один (xBoundTCPSocketsList
) не существует похоже, принадлежит к любому. c источнику. Оба появляются в файле карты:
$ grep -n -A 1 -E 'xBoundTCPSocketsList|xBoundUDPSocketsList' image/DSP.map
61974: .bss.xBoundTCPSocketsList
61975- 0x000000002001ac7c 0x14 ./build/DSP/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.o
61976: 0x000000002001ac7c xBoundTCPSocketsList
61977: .bss.xBoundUDPSocketsList
61978- 0x000000002001ac90 0x14 ./build/DSP/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.o
61979: 0x000000002001ac90 xBoundUDPSocketsList
Даже addr2line терпит неудачу:
$ arm-none-eabi-addr2line -a -e image/DSP.elf 2001ac7c 2001ac90
0x2001ac7c
??:0
0x2001ac90
/home/max/Lavori/4202/src/repos/toremove/FW/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.c:162
, даже FreeRTOS_Sockets.lst
больше ничего мне не говорит:
7337 .global xBoundTCPSocketsList
7338 .global xBoundUDPSocketsList
7339 .section .bss.xBoundTCPSocketsList,"aw",%nobits
7340 .align 2
7341 .set .LANCHOR2,. + 0
7344 xBoundTCPSocketsList:
7345 0000 00000000 .space 20
7345 00000000
7345 00000000
7345 00000000
7345 00000000
7346 .section .bss.xBoundUDPSocketsList,"aw",%nobits
7347 .align 2
7348 .set .LANCHOR1,. + 0
7351 xBoundUDPSocketsList:
7352 0000 00000000 .space 20
7352 00000000
7352 00000000
7352 00000000
7352 00000000
В исполняемом файле присутствует много других символов, но, похоже, они не связаны ни с каким исходным файлом. c.
Почему такое поведение? Что меняется между двумя символами xBoundTCPSocketsList
и xBoundUDPSocketsList
? Я неправильно понимаю или пропускаю некоторые параметры отладки при компиляции? Как получить nm или какой-либо другой способ получить источник. c, где объявлен символ?
EDIT:
Я не думаю, что проблема заключается в связывании
На самом деле, я получаю тот же результат arm-none-eabi-nm, даже если анализирую ./build/DSP/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.o
:
$ arm-none-eabi-nm -a -l -n -t x --print-size build/DSP/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.o | grep -E '^[[:xdigit:]]{8} [[:xdigit:]]{8} B' | grep SocketsList
00000000 00000014 B xBoundTCPSocketsList
00000000 00000014 B xBoundUDPSocketsList /home/max/Lavori/4202/src/repos/toremove/FW/amazon-freertos/lib/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.c:162