我目前正在尝试将 NFS 服务器集成到RTEMS 4.9.2
在POWER PC 5200
. 这将很难简洁地解释,所以请耐心等待。
RTEMS NFS
目前 RTEMS 通过 nfs.c 文件实现 NFS 客户端。为了激活命令行界面并能够使用mount -t nfs ...
您需要添加#define CONFIGURE_SHELL_MOUNT_NFS
到配置文件并将 rtems nfs 文件与-lnfs
. 有关更多详细信息,请参见此处。正确执行此操作使我们能够实现 RTEMS nfs 客户端,并且我们可以从命令行挂载远程驱动器。
直接使用 RTEMS NFS 客户端
我们没有在程序中公开 RTEMS 命令行,因此我们希望能够直接使用 nfs 接口。RTEMS 库提供了librtemsNfs.h
包含实现 nfs 客户端的功能。这些函数的实现在nfs.c
其中被编译以创建 2 个库中的 1 个:
libnfs.a
nfs.rel
两者都需要构建。作为我们代码的一部分,我们正在使用在nfsInit(...
中声明librtemsNfs.h
和定义的函数nfs.c
。
错误
所以错误非常明显。当我们构建时,我们得到链接器错误:
D:\Git\nfs_stuff\Src\RTEMS_proj/init/srvinit.cpp:453: undefined reference to `nfsInit(int, int)'
collect2: ld returned 1 exit status
尝试链接这些库
为了将这些联系起来,我们尝试了多种方式。我们有一个makefile
但为了让每个人都更容易做到这一点,我将展示命令行构建的结果。我们尝试过:
- 推荐的方法是链接 -lnfs (来源 - 一个老问题),这样做会产生一个很好的长而复杂的构建命令:
powerpc-rtems4.9-g++ -g -Wall -g -mcpu=603e -mstrict-align -meabi -msdata -fno-common ... -MANY_PREPROCESSOR_ARGUMENTS ... -MANY_INCLUDE_FILES ... Map=./exe/srvevp。 map -lc -lm --gc-sections -lnfs -mcpu=603e -mstrict-align -meabi ... -MANY_OBJECT_FILES ... ./exe/obj/srvinit.o ... -MANY_MORE_OBJECT_FILES
-lnfs
在包含有问题的目标文件 ( ) 之前,我们的编译和链接命令具有, srvinit.o
。但是我们仍然得到链接器错误。
- 我试图通过路径直接链接到
.a
and.rel
文件。我们通过/c/rtems-4.9/powerpc-rtems4.9/5200/lib/libnfs.a /c/rtems-4.9/powerpc-rtems4.9/5200/lib/nfs.rel
在命令行中添加:来做到这一点。我们在有问题的目标文件之前和之后都添加了它。我们还尝试使用-L
命令强制按路径链接。所有这些都会导致相同的错误。
其他一些信息
这很难描述,但是当删除libnfs.a
文件的直接链接时,即使没有直接使用 nfs,我们也无法构建。IE。内部 RTEMS 文件无法相互链接。这很奇怪,在我看来你应该只需要-lnfs
构建命令行选项,但即使没有这个标志它也能成功构建。如果没有直接包含,我们会得到错误:
c:/rtems-4.9/powerpc-rtems4.9/5200/lib\librtemscpu.a(libshell_a-main_mount_nfs.o): In function `rtems_shell_nfs_mounter':
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\adept_5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:46: undefined reference to `rpcUdpInit'
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:51: undefined reference to `nfsInit'
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:58: undefined reference to `nfsMount'
collect2: ld returned 1 exit status
这是 rtems shell 代码无法链接。如果我们将/c/rtems-4.9/powerpc-rtems4.9/5200/lib/libnfs.a /c/rtems-4.9/powerpc-rtems4.9/5200/lib/nfs.rel
加到构建行的末尾,那么一切都会成功。
要重新迭代,构建需要直接包含 nfs.a
和.rel
文件的命令行功能,您不需要使用-lnfs
.
问题
所以第一个也是最明显的问题是,为什么这不是链接,即使我明确给出了库文件?我对此的想法是,也许这些文件不包括我正在尝试使用的函数的定义。但这在其他信息部分不可信,因为我需要它们链接 RTEMS 操作系统本身的功能。
我知道这也很难给出直接的答案,因为如果没有安装 PC 和所有编译器等,它将非常无法重现。我如何检查 lib 文件是否包含我的函数的定义并被链接以正确的顺序?该编译器是 RTEMS 为 Power PC 5200 提供的 BSP 特定GCC
样式编译器。它接受 GCC/G++ 4.2 可接受的大多数编译器选项。
最后,有什么好的方法可以调试这样的链接器问题吗?.