编辑:我问了一个错误的问题,不要使用芦苇,请参阅下面的说明。
我已经交叉编译了两个存档文件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。 任何人都可以帮我澄清为什么我的静态库需要这些共享对象?如果需要,我会发布更多细节,我不能再想了。感谢。
编辑: 显然我不小心将程序的动态链接版本复制到目标而没有注意到它,......两次....现在我转移了它的实际静态可执行文件。我很抱歉。