2

我在 location.c 中遇到了 apache jsvc java 守护程序的以下代码。

char *location_jvm_cfg[] = {
    "$JAVA_HOME/jre/lib/jvm.cfg",           /* JDK */
    "$JAVA_HOME/lib/jvm.cfg",               /* JRE */
    "$JAVA_HOME/jre/lib/" CPU "/jvm.cfg",   /* JDK */
    "$JAVA_HOME/lib/" CPU "/jvm.cfg",       /* JRE */
    NULL,
};

我通过源代码查找CPU宏在代码中扩展 "$JAVA_HOME/jre/lib/" CPU "/jvm.cfg"但找不到这样的宏定义。

我不确定 CPU 是 C 宏还是其他正在配置 autoconf 工具的东西。

上面的 CPU 值如何替换为实际的 CPU 值?

我面临的问题是,当我在 Solaris 上构建 jsvcCFLAGSLDFLAGS设置为 -m64 时,生成的 64 位 solaris 二进制文件会尝试从而$JAVA_HOME/jre/lib/sparc/jvm.cfg不是加载 jvm .so 文件$JAVA_HOME/jre/lib/sparcv9/jvm.cfg

更新

使用以下命令行运行 JSVC 附带的 ./configure 是正确的

configure --with-java=/path/to/jdk1.7.0_45 --host=sparcv9-sun-solaris2.10 CFLAGS="-m64" LDFLAGS="-m64"

额外的--host=sparcv9-sun-solaris2.10导致生成的 gcc 命令是

gcc -m64 -DOS_SOLARIS -DDSO_DLFCN -DCPU=\"sparcv9\" -Wall -Wstrict-prototypes

代替

gcc -m64 -DOS_SOLARIS -DDSO_DLFCN -DCPU=\"sparc\" -Wall -Wstrict-prototypes

这就是导致生成的 64 位 jsvc 二进制文件尝试链接 32 位 so 文件而不是 64 位 so 文件的原因。

4

2 回答 2

3

它绝对必须是预处理器定义。该代码中没有其他任何东西可以工作。

为了使 configure 使用不同的 CPU,configure 脚本可能需要一个配置三元组。这可能看起来像“i686-unknown-gnu-linux”

显然configure.guess是在解决这个问题。如果您在配置命令行上指定这些三元组(四元组?)之一,它可能会认为它是在交叉编译器中构建的,但它应该可以工作。

于 2013-11-06T20:26:24.817 回答
1

生成的configure脚本根据configure--host的值将-DCPU添加到CFLAGS,默认为configure--build,默认为猜测值。

于 2013-11-06T19:51:29.023 回答