静态链接的可执行文件需要共享库

时间:2017-11-18 18:16:52

标签: c++ static embedded shared-objects

编辑:我问了一个错误的问题,不要使用芦苇,请参阅下面的说明。

我已经交叉编译了两个存档文件a.a和b.a,并将它们静态链接到可执行文件exe.elf。 我已经验证(遵循these指令)天气我的可执行文件确实是静态地使用readelf -dhl exe.elf:

user@host:~/program/bin$ readelf -dhl exe.elf
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - GNU
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x12a45
  Start of program headers:          52 (bytes into file)
  Start of section headers:          13513704 (bytes into file)
  Flags:                             0x5000400, Version5 EABI, hard-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         40
  Section header string table index: 39

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz Flg Align
  EXIDX          0x11c558 0x0012c558 0x0012c558 0x047a0 0x047a0 R   0x4
  LOAD           0x000000 0x00010000 0x00010000 0x120cfc 0x120cfc R E 0x10000
  LOAD           0x120f48 0x00140f48 0x00140f48 0x05ab8 0x0aa9c RW  0x10000
  NOTE           0x000114 0x00010114 0x00010114 0x00044 0x00044 R   0x4
  TLS            0x120f48 0x00140f48 0x00140f48 0x00038 0x000a0 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
  GNU_RELRO      0x120f48 0x00140f48 0x00140f48 0x040b8 0x040b8 R   0x1

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx
   01     .note.ABI-tag .note.gnu.build-id .rel.dyn .init .iplt .text  __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata __libc_subfreeres __libc_IO_vtables __libc_atexit __libc_thread_subfreeres .ARM.extab .ARM.exidx .eh_frame
   02     .tdata .init_array .fini_array .data.rel.ro .got .data .bss __libc_freeres_ptrs
   03     .note.ABI-tag .note.gnu.build-id
   04     .tdata .tbss
   05
   06     .tdata .init_array .fini_array .data.rel.ro

There is no dynamic section in this file.

这告诉我,此文件中没有动态部分。     nm | grep " U " 没有检查动态依赖关系:

ldd exe.elf not a dynamic executable

还告诉我这是一个静态可执行文件。

当我将程序转移到目标计算机(armv7)并尝试执行它时,它敢于告诉我我缺少共享对象。

user@target:/program/bin$ ./exe.elf
./exe.elf: error while loading shared libraries: libfirstlibrary.so: cannot 
open shared object file: No such file or directory.

我的目标计算机上没有binutils,因为这是一个非常小的linux设置,这是我需要静态编译的部分原因。我的$ LD_LIBRARY_PATH是空的,但我不应该需要它......对吗?

我使用linaro工具链和g ++ -static -l:libfirstlib.a -l:libsecondlib.a按this帖子中的建议编译了我看似静态的可执行文件exe.elf。 任何人都可以帮我澄清为什么我的静态库需要这些共享对象?如果需要,我会发布更多细节,我不能再想了。感谢。

编辑: 显然我不小心将程序的动态链接版本复制到目标而没有注意到它,......两次....现在我转移了它的实际静态可执行文件。我很抱歉。

0 个答案:

没有答案