2012-10-10 39 views
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'被抛出。 memcpy从未在代码中使用,并且未定义。代码链接为独立,所以它不会与C库冲突。出于某种原因,链接器认为上述函数在函数调用开始时调用memcpy,我不知道为什么。

为什么会发生这种情况?

+0

我建议反汇编目标文件,看看'memcpy'被调用的地方。 – FamZheng

回答

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是隐式调用。

+0

没有考虑长篇副本。谢谢! (将在5分钟内打开时选择答案) –