1

我修改了 qnx 的 io-packet 并在 ip 层的 recieve.c 文件中计算时间戳。

代码:

uint64_t ipStart_time, IPLatency;
EXPORT_SYMBOL(IPLatency);         //I am using this in Linux

void rtl_receive ()
{
      ipStart_time = clock_cycles();
      IPLatency = ipStart_time;
}

我想在我的用户程序中读取该时间戳:

所以我做了:代码:

extern uint64_t IPLatency;

但它显示error: undefined reference to IPLatency

4

3 回答 3

0

我在这里猜测了一下,因为没有太多关于这些文件所在位置的信息。作为免责声明,这里有....

您编辑了属于操作系统内核的文件并导出了符号。这只会使符号对希望与内核链接的内核模块可见,而不是对用户空间程序可见。您的用户空间程序未链接到内核,因此当您尝试链接时,链接器找不到对它的引用IPLatency并退出。

extern 关键字告诉编译器这个符号在这个文件的外部,所以只要假设它存在并让链接器担心它。extern 定义的目的是让编译器知道这个变量的类型,而不是为它保留内存。链接器需要找到所有符号才能将符号转换为对正确内存位置的实际引用。因此,需要在您尝试链接的程序中的某处声明一个外部变量。

您尝试做的是将信息从内核空间传输到用户空间。这将变得更加困难,涉及新的系统调用或通过其他机制(例如 sysfs)提供信息。您可能需要进行更多研究,然后再问另一个问题(这个问题的答案可能超出我的范围)。

于 2014-05-14T08:46:53.083 回答
0

答案可能很简短:EXPORT_SYMBOL用于在内核中导出符号,例如导出到其他内核模块。您的用户空间程序将无法访问它,因此您的链接器会报告undefined reference错误。

建议:通过类似的东西发送数据copy_to_user将信息写入/proc并让用户空间程序从中读取。

于 2014-05-14T09:03:49.987 回答
0

关键字通知编译器extern它应该期望在另一个链接对象中定义一个函数或变量(符号)。对于一个函数,这意味着如果一个函数没有被实现,编译器不会给出错误。

您得到的错误undefined reference表明链接器在链接中包含的任何目标文件中都找不到具有该签名的导出符号。

于 2014-05-14T08:45:08.017 回答