【问题标题】:set global gcc default search paths设置全局 gcc 默认搜索路径
【发布时间】:2011-11-20 13:19:55
【问题描述】:

运行时

arm-none-linux-gnueabi-gcc -print-search-dirs | grep libraries | sed 's/:/\n/g'

我得到以下输出:

libraries
 =/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/lib/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/lib/
/opt/codesourcery/arm-none-linux-gnueabi/libc/lib/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/arm-none-linux-gnueabi/libc/lib/
/opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/arm-none-linux-gnueabi/4.4.1/
/opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/

当交叉编译一些包时,能够附加到这些路径将使我的生活更容易。我知道 -L 选项,我想使用它,但是许多包在交叉编译时不尊重它,而且将它与 codesourcery 一起使用会导致问题。 (有关详细信息,请参阅本文末尾)。基本上我有一个完整的目录树,其中包含编译包所需的所有文件,我想将该目录树添加到默认搜索路径中。例如,这样 -print-search-dirs 也会输出类似于以下内容的路径:

/target/usr/lib
/target/lib

除了已经列出的路径。我不是在寻找特定于代码源的答案,因为我有几个可以使用的工具链。

对于那些好奇的人,这里是 codesourcery 安装的错误:

arm-none-linux-gnueabi-gcc test.c

作品

arm-none-linux-gnueabi-gcc -L/usr/arm-unknown-linux-gnueabi/usr/lib test.c 

失败:

/lib/libc.so.6: file not recognized: File format not recognized
collect2: ld returned 1 exit status

很明显它正在从主机中获取 libc。我已经看到这种情况发生在不止一个工具链上,但不是全部。

回应评论: 这是

的输出
arm-none-linux-gnueabi-gcc -L/usr/arm-unknown-linux-gnueabi/usr/lib test.c -v -Wl,-verbose
使用内置规范。 目标:arm-none-linux-gnueabi 配置:/scratch/julian/2010q1-release-linux-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target =arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=armv5te --with- gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} %{O2:%{ !fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove- local-statics}}}' --enable-languages=c,c++ --enable-shared --disable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2010q1- 202' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux- gnueabi/libc --with-build-sysroot=/scratch/julian/2010q1-release-linux-lite/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/jul ian/2010q1-release-linux-lite/obj/host-libs-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1- release-linux-lite/obj/host-libs-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-linux- lite/obj/host-libs-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++ ,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-linux-lite/obj/host-libs-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu /usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-linux-lite/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-linux-lite/install/arm-none-linux-gnueabi/bin 线程模型:posix gcc 版本 4.4.1 (Sourcery G++ Lite 2010q1-202) COLLECT_GCC_OPTIONS='-L/usr/arm-unknown-linux-gnueabi/usr/lib''-v''-march=armv5te''-funwind-tables' /opt/codesourcery/libexec/gcc/arm-none-linux-gnueabi/4.4.1/cc1 -quiet -v test.c -quiet -dumpbase test.c -march=armv5te -auxbase test -version -funwind-tables - o /tmp/ccaDSo09.s 忽略不存在的目录“/opt/codesourcery/arm-none-linux-gnueabi/libc/usr/local/include” #include "..." 搜索从这里开始: #include 搜索从这里开始: /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/include /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/include-fixed /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/include /opt/codesourcery/arm-none-linux-gnueabi/libc/usr/include 搜索列表结束。 GNU C (Sourcery G++ Lite 2010q1-202) 版本 4.4.1 (arm-none-linux-gnueabi) 由 GNU C 版本 4.3.2、GMP 版本 4.3.1、MPFR 版本 2.4.2 编译。 GGC 启发式:--param ggc-min-expand=100 --param ggc-min-heapsize=131072 编译器可执行校验和:250bf78701f747da89e730786c466148 COLLECT_GCC_OPTIONS='-L/usr/arm-unknown-linux-gnueabi/usr/lib''-v''-march=armv5te''-funwind-tables' /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/as -v -march=armv5te -meabi=5 -o /tmp/ccQTJKJd.o /tmp/ccaDSo09.s GNU 汇编器版本 2.19.51 (arm-none-linux-gnueabi) 使用 BFD 版本 (Sourcery G++ Lite 2010q1-202) 2.19.51.20090709 COMPILER_PATH=/opt/codesourcery/libexec/gcc/arm-none-linux-gnueabi/4.4.1/:/opt/codesourcery/libexec/gcc/arm-none-linux-gnueabi/4.4.1/:/opt/codesourcery /libexec/gcc/arm-none-linux-gnueabi/:/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/:/opt/codesourcery/lib/gcc/arm-none-linux -gnueabi/:/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ LIBRARY_PATH=/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/:/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../.. /../../arm-none-linux-gnueabi/lib/:/opt/codesourcery/arm-none-linux-gnueabi/libc/lib/:/opt/codesourcery/arm-none-linux-gnueabi/libc /usr/lib/ COLLECT_GCC_OPTIONS='-L/usr/arm-unknown-linux-gnueabi/usr/lib''-v''-march=armv5te''-funwind-tables' /opt/codesourcery/libexec/gcc/arm-none-linux-gnueabi/4.4.1/collect2 --sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --eh-frame-hdr -dynamic-链接器 /lib/ld-linux.so.3 -X -m armelf_linux_eabi /opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/crt1.o /opt/codesourcery/arm-none-linux-gnueabi /libc/usr/lib/crti.o /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/crtbegin.o -L/usr/arm-unknown-linux-gnueabi/usr/lib -L/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1 -L/opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../.. /../../arm-none-linux-gnueabi/lib -L/opt/codesourcery/arm-none-linux-gnueabi/libc/lib -L/opt/codesourcery/arm-none-linux-gnueabi/libc /usr/lib /tmp/ccQTJKJd.o -verbose -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /opt/codesourcery /lib/gcc/arm-none-linux-gnueabi/4.4.1/crtend.o /opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/crtn.o GNU ld (Sourcery G++ Lite 2010q1-202) 2.19.51.20090709 支持的仿真: armelf_linux_eabi armelfb_linux_eabi 使用内部链接器脚本: ==================================================== /* -z combreloc 的脚本:组合和排序 reloc 部分 */ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", “elf32-littlearm”) OUTPUT_ARCH(臂) 条目(_开始) SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); 部分 { /* 只读部分,合并到文本段中: */ 提供(__executable_start = SEGMENT_START(“文本段”,0x00008000)); . = SEGMENT_START("文本段", 0x00008000) + SIZEOF_HEADERS; .interp : { *(.interp) } .note.gnu.build-id : { *(.note.gnu.build-id) } .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } .dynsym : { *(.dynsym) } .dynstr : { *(.dynstr) } .gnu.version : { *(.gnu.version) } .gnu.version_d : { *(.gnu.version_d) } .gnu.version_r : { *(.gnu.version_r) } .rel.dyn: { *(.rel.init) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) *(.rel.fini) *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) *(.rel.ctors) *(.rel.dtors) *(.rel.got) *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) *(.rel.ifunc) } .rela.dyn: { *(.rela.init) *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) *(.rela.fini) *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) *(.rela.ctors) *(.rela.dtors) *(.rela.got) *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) *(.rela.ifunc) } .rel.plt : { *(.rel.plt) PROVIDE_HIDDEN (__rel_iplt_start = .); *(.rel.iplt) PROVIDE_HIDDEN (__rel_iplt_end = .); } .rela.plt : { *(.rela.plt) PROVIDE_HIDDEN (__rela_iplt_start = .); *(.rela.iplt) PROVIDE_HIDDEN (__rela_iplt_end = .); } 。在里面 : { 保持 (*(.init)) } =0 .plt : { *(.plt) *(.iplt)} 。文本 : { *(.text .stub .text.* .gnu.linkonce.t.*) /* .gnu.warning 部分由 elf32.em 专门处理。 */ *(.gnu.warning) *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx) } =0 .fini: { 保持 (*(.fini)) } =0 提供 (__etext = .); 提供 (_etext = .); 提供 (etext = .); .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } .rodata1 : { *(.rodata1) } .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } PROVIDE_HIDDEN (__exidx_start = .); .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } PROVIDE_HIDDEN (__exidx_end = .); .eh_frame_hdr : { *(.eh_frame_hdr) } .eh_frame : ONLY_IF_RO { 保持 (*(.eh_frame)) } .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } /* 调整数据段的地址。我们想调整到 同上一页内页地址。 */ . =对齐(常量(MAXPAGESIZE))-((常量(MAXPAGESIZE)-。)&(常量(MAXPAGESIZE)-1)); . = DATA_SEGMENT_ALIGN(常量(MAXPAGESIZE),常量(COMMONPAGESIZE)); /* 异常处理 */ .eh_frame : ONLY_IF_RW { 保持 (*(.eh_frame)) } .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } /* 线程本地存储部分 */ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); 保持 (*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); } .init_array : { PROVIDE_HIDDEN (__init_array_start = .); 保持 (*(SORT(.init_array.*))) 保持 (*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); } .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); 保持 (*(SORT(.fini_array.*))) 保持 (*(.fini_array)) PROVIDE_HIDDEN (__fini_array_end = .); } .ctors: { /* gcc 使用 crtbegin.o 查找开始 构造函数,所以我们确保它是 第一的。因为这是一个通配符,所以它 如果用户不这样做也没关系 实际上链接到 crtbegin.o;这 链接器不会寻找匹配的文件 通配符。通配符也意味着它 哪个目录 crtbegin.o 无关紧要 在。 */ 保持 (*crtbegin.o(.ctors)) 保持 (*crtbegin?.o(.ctors)) /* 我们不想包含 .ctor 部分 crtend.o 文件直到排序的ctors之后。 crtend 文件中的 .ctor 部分包含 ctors 标记的结尾,它必须是最后一个 */ 保持 (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) 保持 (*(SORT(.ctors.*))) 保持 (*(.ctors)) } .dtors: { 保持 (*crtbegin.o(.dtors)) 保持 (*crtbegin?.o(.dtors)) 保持 (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) 保持 (*(排序(.dtors.*))) 保持 (*(.dtors)) } .jcr : { 保持 (*(.jcr)) } .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d. rel.ro.*) } .dynamic : { *(.dynamic) } . = DATA_SEGMENT_RELRO_END (0, .); .got : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) } 。数据 : { __data_start = 。 ; *(.data .data.* .gnu.linkonce.d.*) 排序(构造函数) } .data1 : { *(.data1) } _eddata = .;提供(数据=。); __bss_start = .; __bss_start__ = .; .bss: { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(常见的) /* 在这里对齐以确保 .bss 部分占用空间最多 _结尾。在 .bss 之后对齐以确保正确对齐,即使 .bss 部分消失,因为没有输入部分。 FIXME:我们为什么需要它?当没有 .bss 部分时,我们不会 填充 .data 部分。 */ . =对齐(。!= 0?32 / 8:1); } _bss_end__ = . ; __bss_end__ = 。 ; . =对齐(32 / 8); . =对齐(32 / 8); __end__ = . ; _end = .;提供(结束=。); . = DATA_SEGMENT_END (.); /* Stabs 调试部分。 */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF 调试部分。 DWARF 调试部分中的符号相对于开头 所以我们从 0 开始。 */ /* 矮人 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 扩展 */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 和 DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* 矮人 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 扩展 */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } /* 矮人 3 */ .debug_pubtypes 0 : { *(.debug_pubtypes) } .debug_ranges 0 : { *(.debug_ranges) } .gnu.attributes 0 : { 保持 (*(.gnu.attributes)) } .note.gnu.arm.ident 0 : { 保持 (*(.note.gnu.arm.ident)) } /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) } } ==================================================== 尝试打开 /opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/crt1.o 成功 /opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/crt1.o 尝试打开 /opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/crti.o 成功 /opt/codesourcery/arm-none-linux-gnueabi/libc/usr/lib/crti.o 尝试打开 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/crtbegin.o 成功 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/crtbegin.o 尝试打开 /tmp/ccQTJKJd.o 成功 /tmp/ccQTJKJd.o 尝试打开 /usr/arm-unknown-linux-gnueabi/usr/lib/libgcc.so 失败 尝试打开 /usr/arm-unknown-linux-gnueabi/usr/lib/libgcc.a 失败 尝试打开 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/libgcc.so 失败 尝试打开 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/libgcc.a 成功 尝试打开 /usr/arm-unknown-linux-gnueabi/usr/lib/libgcc_s.so 失败 尝试打开 /usr/arm-unknown-linux-gnueabi/usr/lib/libgcc_s.a 失败 尝试打开 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/libgcc_s.so 失败 尝试打开 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/libgcc_s.a 失败 尝试打开 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/lib/libgcc_s.so 失败 尝试打开 /opt/codesourcery/lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/lib/libgcc_s.a 失败 尝试打开 /opt/codesourcery/arm-none-linux-gnueabi/libc/lib/libgcc_s.so 成功 -lgcc_s (/opt/codesourcery/arm-none-linux-gnueabi/libc/lib/libgcc_s.so) 尝试打开 /usr/arm-unknown-linux-gnueabi/usr/lib/libc.so 成功 打开脚本文件 /usr/arm-unknown-linux-gnueabi/usr/lib/libc.so 打开脚本文件 /usr/arm-unknown-linux-gnueabi/usr/lib/libc.so 尝试打开 /lib/libc.so.6 成功 打开脚本文件 /lib/libc.so.6 /lib/libc.so.6:文件无法识别:文件格式无法识别 collect2: ld 返回 1 个退出状态

【问题讨论】:

  • 你能发布arm-none-linux-gnueabi-gcc -L/usr/arm-unknown-linux-gnueabi/usr/lib test.c -v -Wl,-verbose的结果吗?
  • 已添加,对格式表示抱歉。我将运行一些谷歌搜索,看看我是否能弄清楚如何将其粘贴在滚动框中并格式化为纯文本。
  • 谢谢!不需要额外的格式化,只需用鼠标选择输出并按下“{}”代码示例按钮(这个输出是可读的)。

标签: gcc cross-compiling glibc codesourcery


【解决方案1】:

您的交叉编译 glibc 配置错误。

-Wl,-verbose 链接器中说:

attempt to open /usr/arm-unknown-linux-gnueabi/usr/lib/libc.so succeeded
opened script file /usr/arm-unknown-linux-gnueabi/usr/lib/libc.so

所以,它使用了您的-L 选项并且能够打开 libc.so。但这不是真正的.so动态库,它是一个脚本(链接器脚本)。

心灵感应模式开启:libc.so 脚​​本的最后一行是

 GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.3 ) )

心灵感应模式关闭

此行包含硬编码的绝对路径,并将链接器从 arm-...abi 重定向到系统的 libc,忽略大多数搜索目录(可能有一些 ld 的秘密选项)。

只需使用任何文本编辑器编辑此文件(进行备份)并将所有/lib 替换为/usr/arm-unknown-linux-gnueabi/lib。 (我良好的交叉编译环境已将此脚本中的所有路径替换为前缀。)

原始脚本应该用于原生编译、原生运行,而不是交叉编译。

更新:bytesex 说 http://linux.bytesex.org/cross-compiler.html/usr/lib/libpthread.so 有同样的问题,请在此文件中进行替换。

要检查其他库,请在库目录中执行file -skL *.so|grep text

【讨论】:

  • 这个问题是libc.so最独特的。 libc 几乎无处不在,因此您在使用任何程序时都会遇到问题。据我所知,没有其他流行的库使用带有绝对路径的自定义链接器脚本。
  • 同种情况的链接:developer.mozilla.org/en/Cross-Compiling_Mozilla"注意:如果你的目标系统使用glibc,y...";
  • 心灵感应模式正确。我还没有解决我的具体问题,但它看起来像是正确的调查方向。还有很多东西要在路上学习。谢谢。
  • Chris H,您是否编辑了您的 libc.so 和 libpthread.so?错误是一样的还是改变了?
  • 我不是想简单地破解一些东西,而是为了更深入地了解正在发生的事情,所以从这个意义上说,你已经回答了我的问题。谢谢。我不会忘记这个问题,当我在阅读了链接器脚本的工作原理和语法后真正进入链接器脚本时,我将在此处专门发布有关代码源的内容。
【解决方案2】:

As explained by @osgx,gcc 正在寻找错误的库路径。尝试在 x86_64 上为 arm 交叉编译程序时遇到了类似的问题。由于编辑 root 拥有的文件不是一个选项,我进一步搜索并发现了 --sysroot 选项:

--sysroot=目录
使用 dir 作为头文件和库的逻辑根目录。例如,如果编译器通常在 /usr/include 中搜索头文件,在 /usr/lib 中搜索库,它会改为搜索 dir/usr/include 和 dir/usr/lib。

如果您同时使用此选项和 ​​-isysroot 选项,则 --sysroot 选项适用于库,但 -isysroot 选项适用于头文件。

GNU 链接器(从 2.16 版开始)对此选项具有必要的支持。如果您的链接器不支持此选项,则 --sysroot 的头文件部分仍然有效,但库部分不支持。

示例用法:

./configure --host=arm-unknown-linux-gnueabi \
    CFLAGS='-g -O2 --sysroot=/tmp/rpi-root'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多