nm: некоторые символы не связаны ни с одним исходным файлом - PullRequest
1 голос
/ 17 февраля 2020

Во моем встроенном проекте я компилирую 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

1 Ответ

0 голосов
/ 01 апреля 2020

Я открыл ошибку в системе отслеживания ошибок binutils:
https://sourceware.org/bugzilla/show_bug.cgi?id=25676

Я думаю, что могу сказать, что это исправлено.

...