GDB 调试器 - 未定义"malloc"。尝试使用调试器分配 C 数组



我已经编译了一些软件,以便在嵌入式NRF24目标上运行,从这里使用gcc-arm-none-eabi工具链(一个为gdb提供python3支持的自定义工具链(。我主要尝试在运行时从GDB调试器控制台malloc一个数组,然后用我提供的元素填充它。

我在一个.c文件中定义了一个指针,比如:static float32_t *array;。然后,我想从GDB控制台内部调用一个cmd,比如:call (void*) malloc(num_of_elements*sizeof(float32_t)),在运行时分配一个数组,然后用一些元素填充它,比如call (void*) memcpy(array, {var1, var2... var n}, n)

我的问题是GDB调试器找不到mallocstdlib函数。如果我做了这样的事情:

break malloc 
Function "malloc" not defined.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]

它找不到这个函数,尽管它可以找到<string.h>fns,比如memcpy,我不太明白为什么会这样。

我有一种感觉,这可能与链接有关,该程序是用Makefile构建的,最后的标志可能很有趣:

LIB_FILES += 
$(SDK_ROOT)/components/toolchain/cmsis/dsp/GCC/libarm_cortexM4lf_math.a 
# Optimization flags
OPT = -O0 -g3
# Uncomment the line below to enable link time optimization
#OPT += -flto
# C flags common to all targets
CFLAGS += $(OPT)
CFLAGS += -DBOARD_PCA10056
CFLAGS += -DARM_MATH_CM4
CFLAGS += -DBSP_DEFINES_ONLY
CFLAGS += -DCONFIG_GPIO_AS_PINRESET
CFLAGS += -DFLOAT_ABI_HARD
CFLAGS += -DNRF52840_XXAA
CFLAGS += -mcpu=cortex-m4
CFLAGS += -mthumb -mabi=aapcs
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# keep every function in a separate section, this allows linker to discard unused ones
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CFLAGS += -fno-builtin -fshort-enums
CFLAGS += -DDEV8_PINOUT
CFLAGS += -DNUM_FLASH_BLOCKS=128
CFLAGS += -DDEBUG
CFLAGS += -DNRF_LOG_ENABLED=1
CFLAGS += -DNRF_LOG_BACKEND_UART_ENABLED=1
# C++ flags common to all targets
CXXFLAGS += $(OPT)
# Assembler flags common to all targets
ASMFLAGS += $(OPT)
ASMFLAGS += -mcpu=cortex-m4
ASMFLAGS += -mthumb -mabi=aapcs
ASMFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
ASMFLAGS += -DBOARD_PCA10056
ASMFLAGS += -DBSP_DEFINES_ONLY
ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET
ASMFLAGS += -DFLOAT_ABI_HARD
ASMFLAGS += -DNRF52840_XXAA
ASMFLAGS += -DARM_MATH_CM4
# Linker flags
LDFLAGS += $(OPT)
LDFLAGS += -mthumb -mabi=aapcs -L$(SDK_ROOT)/modules/nrfx/mdk -T$(LINKER_SCRIPT)
LDFLAGS += -mcpu=cortex-m4
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# let linker dump unused sections
LDFLAGS += -Wl,--gc-sections
# use newlib in nano version
LDFLAGS += --specs=nano.specs
LDFLAGS += -Wl,--print-memory-usage
nrf52840_xxaa: CFLAGS += -D__HEAP_SIZE=8192
nrf52840_xxaa: CFLAGS += -D__STACK_SIZE=8192
nrf52840_xxaa: ASMFLAGS += -D__HEAP_SIZE=8192
nrf52840_xxaa: ASMFLAGS += -D__STACK_SIZE=8192
# Add standard libraries at the very end of the linker input, after all objects
# that may need symbols provided by these libraries.
LIB_FILES += -lc -lnosys -lm

为了调试,我使用带有Jlink服务器类型设置的GDB。

您的代码需要显式引用符号以强制其链接,并且需要防止链接优化删除未使用的引用。您可以简单地通过函数指针实例化来引用符号,而不是进行具有潜在不必要副作用的伪调用:

void* (*volatile force_malloc_link)(size_t) = &malloc ;

或者更简单地说,因为您实际上不会通过指针调用函数:

volatile void* force_link_malloc = &malloc ;

你可以用宏为任何你想链接的符号使其通用:

#define FORCE_LINK( sym ) volatile void* force_link_ ## sym = &sym 

你也可以强制链接整个库(如果你有空间的话(-如何强制gcc链接一个未使用的静态库。其中一个答案解释了如何解包静态库并链接各个对象文件。

它找不到此函数

函数可能未链接到二进制文件中。

  • 您的二进制是否在其他地方调用malloc
  • 你链接的是libc.so还是libc.a
  • nm a.out | grep ' malloc'找到了吗

查找<string.h>fns,如memcpy

如果您的二进制调用memcpy,并且针对libc.a进行链接,则memcpy实现将被链接进来。使用上面的相同nm命令将显示memcpy符号存在,而malloc不存在。

如果你想在运行时调用malloc,你需要确保它被链接进来

const char *argv0;
int main(int argc, char *argv[])
{
argv0 = strdup(argv[0]);  // This should guarantee that malloc is linked in.
// rest of the program
}

最新更新