2012-10-10 81 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分鐘內打開時選擇答案) –