0

我一直在尝试为嵌入式 linux(2.6)交叉编译 jamvm(包括 GNU 类路径),但我被困在一个微妙的地方。

我会尝试总结一下:在经历了很多错误之后,我终于为我的架构编译了包,但是虽然我在 ./configure 中指定了 --enable-static,但当我尝试运行 jamvm 时,它抱怨找不到 GLIBC 2.4 . 问题是我有 2.3.5 版本并且为我的架构编译 2.4 暂时不是一个选择(这意味着要开始一个全新的问题)。

我怀疑问题出在使用与嵌入式目标支持的工具链不同的机器上构建。

问题是我知道与我的 CPU 匹配的确切 gcc、glibc、binutils 和 linux 内核头文件,但问题是我不知道如何将这些信息合并到交叉编译/构建过程中。

但是,假设我的机器使用不同的工具链这一事实会影响交叉编译,也许我错了。

简单地说,我需要交叉编译 jamvm,它不会抱怨 glibc 2.4 或嵌入式系统不支持的任何其他库(假设我知道适合我的架构的正确工具链)

我非常感谢有关此问题的任何帮助。如果我的推理不正确,我也希望能对这个话题有所了解。

4

1 回答 1

2

我不确定我是否 100% 理解您的问题,但也许可以尝试使用以下方法构建一个创建对 GLIBC 2.4 的依赖项的符号列表:

$ readelf -Ws <your_jamvm_executable_file> | grep \@GLIBC_2\.4

grep(如果找不到任何符号,请使用更轻松的搜索模式)

然后,检查违规符号在您的 GLIBC 中是否有其他版本,即等于或低于 GLIBC v2.3.5。我将posix_spawn用作示例:

(1:517)$ readelf -Ws /lib/libc.so.6 | grep posix_spawn\@
  1666: 000d8800    51 FUNC    GLOBAL DEFAULT   12 posix_spawn@@GLIBC_2.15
  1667: 00127760    51 FUNC    GLOBAL DEFAULT   12 posix_spawn@GLIBC_2.2

这意味着如果posix_spawn发现拉入 GLIBC v2.15,您的程序可以重新编译以posix_spawn从 GLIBC v2.2 使用,删除 GLIBC 2.15 依赖项(如果posix_spawn是拉入 GLIBC v2.15 的唯一符号)。

您可以posix_spawn通过在源代码中使用此指令来选择要使用的版本,在实际使用该符号的单元(.c或文件)的开头:.cpp

__asm__(".symver posix_spawn,posix_spawn@GLIBC_2.2");

对不起,如果这不是你要问的。

于 2014-07-02T12:02:05.407 回答