【问题标题】:How to access -ldl in cross compiler in SDK如何在 SDK 的交叉编译器中访问 -ldl
【发布时间】:2017-11-01 11:34:42
【问题描述】:

我正在使用带有交叉编译器的 Xilinx SDK 作为aarch64-none-elf-gcc 我在我的程序中加载一个共享库,我收到错误

Building target: fsbl.elf
Invoking: ARM v8 gcc linker
aarch64-none-elf-gcc -L"/proj/ssw_xhd/boot/balakrish/workspace/hello_world/Debug" -Lwrk/released/2017.3/GA/2017.3_1005_1/installs/lin64/SDK/2017.3/gnu/aarch64/lin/aarch64-none/bin/../lib/gcc/aarch64-none-elf/6.2.1/../../../../aarch64-none-elf/bin/ld -Wl,-T -Wl,../src/lscript.ld -L../../fsbl_bsp/psu_cortexa53_0/lib -o "fsbl.elf"  ./src/psu_init.o ./src/xfsbl_authentication.o ./src/xfsbl_board.o ./src/xfsbl_bs.o ./src/xfsbl_csu_dma.o ./src/xfsbl_dfu_util.o ./src/xfsbl_exit.o ./src/xfsbl_handoff.o ./src/xfsbl_hooks.o ./src/xfsbl_image_header.o ./src/xfsbl_initialization.o ./src/xfsbl_main.o ./src/xfsbl_misc.o ./src/xfsbl_misc_drivers.o ./src/xfsbl_nand.o ./src/xfsbl_partition_load.o ./src/xfsbl_plpartition_valid.o ./src/xfsbl_qspi.o ./src/xfsbl_rsa_sha.o ./src/xfsbl_sd.o ./src/xfsbl_translation_table.o ./src/xfsbl_usb.o   -lhello -Wl,--start-group,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxilffs,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxilsecure,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxilpm,-lxil,-lgcc,-lc,--end-group -n
/tmp/ccjtx6CQ.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0x18c): undefined reference to `dlopen'
<artificial>:(.text.startup+0x18c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `dlopen'
<artificial>:(.text.startup+0x19c): undefined reference to `dlsym'
<artificial>:(.text.startup+0x19c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `dlsym'
<artificial>:(.text.startup+0x1a4): undefined reference to `library_function'
<artificial>:(.text.startup+0x1a4): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `library_function'
<artificial>:(.text.startup+0x1ac): undefined reference to `dlclose'
<artificial>:(.text.startup+0x1ac): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `dlclose'
collect2: error: ld returned 1 exit status
make: *** [fsbl.elf] Error 1

最后我的问题是如何在交叉编译中加载 -ldl 如果我在 C/C++ Build settings-.libraries->library paths 中使用 -ldl 。我收到错误

/wrk/released/2017.3/GA/2017.3_1005_1/installs/lin64/SDK/2017.3/gnu/aarch64/lin/aarch64-none/bin/../lib/gcc/aarch64-none-elf/6.2.1/../../../../aarch64-none-elf/bin/ld: cannot find -ldl
collect2: error: ld returned 1 exit status
make: *** [fsbl.elf] Error 1

【问题讨论】:

  • 二进制文件将在什么操作系统上运行?了解这些工具“aarch64-none”的命名约定意味着没有操作系统。是什么让您认为有一个 dl 库?来自快速谷歌搜索的“Xilinx SDK”似乎旨在构建在裸机上运行的东西。
  • 使用--sysroot 指向目标的头文件和库。

标签: c linux compiler-errors sdk linker


【解决方案1】:

你答案的不同部分似乎有冲突。

dlopendlsym 和朋友用于从文件系统上的另一个 file 加载代码。换句话说,这些函数与在运行时从目标平台文件系统和操作系统上可用的库中加载代码有关。

在交叉编译的情况下,工具链需要提供实现这些功能的库(libdl.solibdl.a)。工具链提供具有相关操作系统调用的代码,以使用代码打开文件,将其映射到内存并将其链接到正在运行的程序中。

这就是冲突发挥作用的地方。您提到的工具链似乎是 bare metal 工具链。换句话说,这是一个直接在芯片上运行代码的工具链,无需操作系统。如果您没有操作系统,那么很明显您不能使用它来在运行时加载更多代码。

考虑到这一点,为什么工具链没有为您提供libdl.a 的合适实现应该很明显了。它不能在平台上通用实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多