1

我有一个 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'抛出 an。memcpy从未在代码中使用,也未定义。该代码是独立链接的,因此它不会与 C 库冲突。出于某种原因,链接器认为上述函数是memcpy在函数调用开始时调用的,我不知道为什么。

为什么会发生这种情况?

4

1 回答 1

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.

于 2012-10-10T05:50:15.173 回答