0

私は ac ファイル foo.c をコンパイルしています:

#include <stdlib.h>

extern void *memcpy_optimized(void* __restrict, void* __restrict, size_t);

void foo() {

    [blah blah blah]

    memcpy_optimized((void *)a, (void *)b, 123);
}

次に、アセンブリ ファイル memcpy_optimized.S があります。

        .text
        .fpu    neon

        .global memcpy_optimized
        .type memcpy_optimized, %function
        .align 4

memcpy_optimized:
    .fnstart
        mov ip, r0
        cmp r2, #16
        blt     4f  @ Have less than 16 bytes to copy

        @ First ensure 16 byte alignment for the destination buffer
        tst r0, #0xF
        beq 2f
        tst r0, #1
        ldrneb  r3, [r1], #1


    [blah blah blah]

    .fnend

両方のファイルは、gcc $< -o $@ -c で正常にコンパイルされます。

しかし、アプリケーションを結果の両方のオブジェクトにリンクすると、次のエラーが発生します。

foo.c:(.text+0x380): undefined reference to `memcpy_optimized(void*, void *, unsigned int)'

私が間違っていることは何か分かりますか?

readelf -a obj/memcpy_optimized.o 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          436 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           40 (bytes)
  Number of section headers:         11
  Section header string table index: 8

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00000000 000040 0000f0 00  AX  0   0 16
  [ 2] .data             PROGBITS        00000000 000130 000000 00  WA  0   0  1
  [ 3] .bss              NOBITS          00000000 000130 000000 00  WA  0   0  1
  [ 4] .ARM.extab        PROGBITS        00000000 000130 000000 00   A  0   0  1
  [ 5] .ARM.exidx        ARM_EXIDX       00000000 000130 000008 00  AL  1   0  4
  [ 6] .rel.ARM.exidx    REL             00000000 00044c 000010 08      9   5  4
  [ 7] .ARM.attributes   ARM_ATTRIBUTES  00000000 000138 000023 00      0   0  1
  [ 8] .shstrtab         STRTAB          00000000 00015b 000056 00      0   0  1
  [ 9] .symtab           SYMTAB          00000000 00036c 0000b0 10     10   9  4
  [10] .strtab           STRTAB          00000000 00041c 00002f 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

Relocation section '.rel.ARM.exidx' at offset 0x44c contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000000  0000012a R_ARM_PREL31      00000000   .text
00000000  00000a00 R_ARM_NONE        00000000   __aeabi_unwind_cpp_pr0

Unwind table index '.ARM.exidx' at offset 0x130 contains 1 entries:

0x0 <memcpy_optimized>: 0x80b0b0b0
  Compact model 0
  0xb0      finish
  0xb0      finish
  0xb0      finish


Symbol table '.symtab' contains 11 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 SECTION LOCAL  DEFAULT    1 
     2: 00000000     0 SECTION LOCAL  DEFAULT    2 
     3: 00000000     0 SECTION LOCAL  DEFAULT    3 
     4: 00000000     0 NOTYPE  LOCAL  DEFAULT    1 $a
     5: 00000000     0 SECTION LOCAL  DEFAULT    4 
     6: 00000000     0 SECTION LOCAL  DEFAULT    5 
     7: 00000000     0 NOTYPE  LOCAL  DEFAULT    5 $d
     8: 00000000     0 SECTION LOCAL  DEFAULT    7 
     9: 00000000     0 FUNC    GLOBAL DEFAULT    1 memcpy_optimized
    10: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr0

No version information found in this file.
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "7-A"
  Tag_CPU_arch: v7
  Tag_CPU_arch_profile: Application
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-2
  Tag_FP_arch: VFPv3
  Tag_Advanced_SIMD_arch: NEONv1
  Tag_DIV_use: Not allowed
4

2 に答える 2

1

foo.c を C++ としてコンパイルしたため、リンク エラーが発生したようです。私がそう言ったのは、リンカが不足している関数の完全なプロトタイプを報告したからです。C 関数はシンボルとして完全なプロトタイプを持っていません (関数の名前のみ) が、C++ マングルされた名前は関数の完全なプロトタイプを表します。

于 2013-07-29T01:46:27.380 に答える
0

多くの Unix および GCC C 実装では、C の名前は、オブジェクト コードの最初のアンダースコアで装飾されています。したがって、C で呼び出すには、アセンブリmemcpy_optimizedで名前を使用する必要があります。_memcpy_optimized

于 2013-07-28T22:30:42.343 に答える