我有一个C函数如下:
static uint32_t initrd_read(fs_node_t *node,
uint32_t offset, uint32_t size, uint8_t *buffer) {
initrd_file_header_t header = file_headers[node->inode];
if (offset > header.length)
return 0;
if (offset+size > header.length)
size = header.length-offset;
memcopy(buffer, header.offset+offset, size);
return size;
}
当与程序的其余部分链接时,会抛出undefined reference to 'memcpy'
。 memcpy
从未在代码中使用,也未定义。代码是独立链接的,因此它与C库没有冲突。由于某种原因,链接器认为上面的函数在函数调用开始时调用memcpy
,我不确定原因。
为什么会发生这种情况?
答案 0 :(得分:3)
memcpy
来执行“长”复制操作(如结构赋值)。例如,在您正在执行的代码中
initrd_file_header_t header = file_headers[node->inode];
对于实际上会被转换为memcpy
调用的内容来说,它看起来很合适。
您是否有理由创建该initrd_file_header_t
对象的副本而不是直接访问原始对象?我没有看到你修改那个对象,所以你可以做到
const initrd_file_header_t *header = &file_headers[node->inode];
并以header->length
等方式访问字段。这可能会消除对memcpy
的隐式调用。