如何避免自动生成导致重新定义错误的“.cold”符号

How to avoid auto-generate a ".cold" symbol which causes redefined error

我试图修改一个项目“CRIU”的部分代码,该项目的代码在https://github.com/checkpoint-restore/criu。我在 criu/pie/restorer.c 中更改了一些代码,具体来说,我在函数 __export_restore_task 中添加了一些新变量。但是,在编译项目时,使用 gcc-9 会产生如下错误。

In file included from criu/cr-restore.c:47:
criu/pie/restorer-blob.h:3:9: error: ISO C99 requires whitespace after the macro name [-Werror]
    3 | #define restorer_sym__export_restore_task.cold 0x47a1
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
criu/pie/restorer-blob.h:6: error: "restorer_sym__export_restore_task" redefined [-Werror]
    6 | #define restorer_sym__export_restore_task 0x2270
      | 
criu/pie/restorer-blob.h:3: note: this is the location of the previous definition
    3 | #define restorer_sym__export_restore_task.cold 0x47a1
      | 

好像多了一个不必要的新符号#define restorer_sym__export_restore_task.cold 0x47a1。删除此行后我可以成功编译项目。

但是用gcc 5.4.0编译工程不会出现这个问题,所以我想可能是gcc版本的问题。另一个原因可能是堆栈的问题,因为我在编译项目的原始版本时添加了一些变量不会有这个问题。无论如何,即使使用 gcc-9 也可以编译没有 .cold 符号的程序吗?

详细信息可以参考我的pull request,https://github.com/checkpoint-restore/criu/pull/1711

#define restorer_sym__export_restore_task.cold 0x47a1

的含义相同
#define restorer_sym__export_restore_task .cold 0x47a1

并且它定义了 restorer_sym__export_restore_task 符号。由于它被再次定义 - 您会收到 警告 。您将警告视为错误。

改变

restorer_sym__export_restore_task.coldrestorer_sym__export_restore_task_cold 编译正常

使用flag -fno-reorder-blocks-and-partition可以解决这个问题,因为flag禁止gcc生成冷热符号