首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么一个函数在符号表中结束,而另一个函数在同一个文件中却没有?

为什么一个函数在符号表中结束,而另一个函数在同一个文件中却没有?
EN

Stack Overflow用户
提问于 2019-09-13 05:54:50
回答 2查看 102关注 0票数 0

我有一个Ada源文件,它有两个功能:

代码语言:javascript
复制
procedure Ghdl_Psl_Assert_Failed
  (Str : Std_String_Ptr; Severity : Integer; Loc : Ghdl_Location_Ptr) is
begin
  Do_Report ("psl assertion", Str, "Assertion violation", Severity, Loc);
end Ghdl_Psl_Assert_Failed;

代码语言:javascript
复制
procedure Ghdl_Psl_Assume_Failed (Loc : Ghdl_Location_Ptr) is
begin
  Do_Report ("psl assumption", null, "Assumption violation",
             Error_Severity, Loc);
end Ghdl_Psl_Assume_Failed;

这两个函数都导出为C风格的符号,如下所示:

代码语言:javascript
复制
pragma Export (C, Ghdl_Psl_Assert_Failed, "__ghdl_psl_assert_failed");
pragma Export (C, Ghdl_Psl_Assume_Failed, "__ghdl_psl_assume_failed");

我构建了这样的文件,至少用于测试用例,以显示问题:

代码语言:javascript
复制
g++ -c -Isrc/ghdl -g -I- src/ghdl/grt-lib.adb

当我使用nm查看符号表时,我看到__ghdl_psl_assert_failed出现了,但是__ghdl_psl_assume_failed没有。

看起来Ghdl_Psl_Assume_Failed()似乎被编译器忽略了,但除此之外,我没有任何线索。当另一个源文件抱怨无法找到函数时,我看到在我的项目的完整构建中出现了错误:

代码语言:javascript
复制
g++ -c -Isrc/ghdl/ -Isrc/clib -Isrc/zlib -Isrc/nuttx/nuttx/include -Isrc/nuttx/nuttx/uclibc/include/uClibc++ -Isrc/nuttx/nuttx/include/cxx -Isrc/nuttx/nuttx/include/nuttx/lib -Isrc/ghdl -g -I- -o /home/jon/controlix/bin/src/ghdl/ghdlrun.o src/ghdl/ghdlrun.adb
ghdlrun.adb:345:19: "Ghdl_Psl_Assume_Failed" not declared in "Lib"
gnatmake: "src/ghdl/ghdlrun.adb" compilation error

有什么想法吗?看起来这个问题在最初的GHDL构建系统中并不存在,但是我必须使用我的项目的构建系统,它不使用GHDL使用的标准的GNAT项目构建系统。

EN

回答 2

Stack Overflow用户

发布于 2019-09-16 03:15:47

如用户tgif建议的那样,使用带有-v的命令行:

代码语言:javascript
复制
g++ -v -c -Isrc/ghdl -g -I- src/ghdl/grt-lib.adb`

显示哪个gnat1但没有错误:

代码语言:javascript
复制
1155120@Macbook: !nm
nm grt-lib.o | more
0000000000002260 s EH_frame1
0000000000001b50 s GCC_except_table0
                 U __Unwind_Resume
00000000000006d0 T ___ghdl_assert_failed
0000000000000caa T ___ghdl_bound_check_failed
0000000000000ff0 T ___ghdl_check_stack_allocation
000000000000115a T ___ghdl_deallocate
0000000000000d5a T ___ghdl_direction_check_failed
0000000000000fac T ___ghdl_i32_exp
0000000000000fcc T ___ghdl_i64_exp
000000000000074e T ___ghdl_ieee_assert_failed
000000000000110e T ___ghdl_malloc
0000000000001126 T ___ghdl_malloc0
0000000000000254 T ___ghdl_memcpy
                 U ___ghdl_now
0000000000000a6a T ___ghdl_program_error
0000000000000806 T ___ghdl_psl_assert_failed
0000000000000884 T ___ghdl_psl_assume_failed
00000000000008f0 T ___ghdl_psl_cover
...

有一点发现,您的grt-lib.adb (左边,来自https://sourceforge.net/p/controlix/code/ci/211711ec27e72ca23262433dfbebe9b905cecffd/tree/src/ghdl_grt/grt-lib.adb)已经过时了:

并且不包含过程Ghdl_Psl_Assume_Failed

日期标记显示2019-08-11,而右侧引用grt-lib.adb来自GHDL 0.37-dev (v0.36-569-g5738c8a) (下载于2019年8月10日,包含过程正文,.ads文件可能也过期)。

看起来,将ghdl_grt与较新的ghdl/src/grt同步是合适的。

8月7日在ghdl主提交0331772c中添加了对PSL_Assume的支持(GMT+12)。

票数 2
EN

Stack Overflow用户

发布于 2019-09-14 09:26:05

为什么要使用g++而不是gcc?这很不寻常。您知道执行哪个gnat1 (尝试使用-v编译)吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57917994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档