a multiple definition link error when using gcc10.3.1

1 环境说明

硬件环境:LS1046A   arm64 

系统环境:openEuler release 22.03 (LTS-SP1)   gcc10.3.1

2 问题现象

一个客户在设备上编译 Suricata 3.1.1 时发现链接时有很多  multiple definition 的错误,

类似如下:

/usr/bin/ld: decode-sctp.o:/root/suricata-3.1.1/src/suricata.h:129: multiple definition of `data_queues';alert-debuglog.o:/root/suricata-3.1.1/src/suricata.h:129: first defined here
/usr/bin/ld: decode-sctp.o:/root/suricata-3.1.1/src/suricata.h:127: multiple definition of `trans_q'; alert-debuglog.o:/root/suricata-3.1.1/src/suricata.h:127: first defined here

3 复现步骤

wget http://www.openinfosecfoundation.org/download/suricata-3.1.1.tar.gzyum makecachednf install -y gcc libpcap-devel pcre-devel libyaml-devel file-devel \zlib-devel jansson-devel nss-devel libcap-ng-devel libnet-devel tar make \libnetfilter_queue-devel lua-devel  libmaxminddb-devel rustc cargo \lz4-devel libnfnetlink-devel 修改suricata的一个内核兼容性问题,否则会报错:在文件src/source-af-packet.c 添加 #include <linux/sockios.h>cd suricata-3.1.1
./configure
make -j8--->
问题multiple definition 海量出现/usr/bin/ld: decode-sctp.o:/root/suricata-3.1.1/src/suricata.h:129: multiple definition of `data_queues';alert-debuglog.o:/root/suricata-3.1.1/src/suricata.h:129: first defined here
/usr/bin/ld: decode-sctp.o:/root/suricata-3.1.1/src/suricata.h:127: multiple definition of `trans_q'; alert-debuglog.o:/root/suricata-3.1.1/src/suricata.h:127: first defined here

4 测试和排查

Ubuntu 20.04.6 LTS  +  gcc version 9.4.0  (X86/ARM64)+ suricata-3.1.1  编译测试OK

openEuler release 22.03 (LTS-SP1) 原装系统内核 + gcc-10.3.1   + suricata-3.1.1  编译测试失败

openEuler release 22.03 (LTS-SP1)   + gcc-9.3 + + suricata-3.1.1  编译测试 OK

 关于如何给gcc降低版本,可以参考如下:

dnf search gcc 看不到低版本gcc 所以只能手动安装https://archives.openeuler.openatom.cn/openEuler-20.09/source/Packages/wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/gcc-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/gcc-c%2B%2B-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/gcc-gfortran-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/libquadmath-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/libquadmath-devel-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/libstdc%2B%2B-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/libgomp-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/cpp-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/libstdc%2B%2B-devel-9.3.1-20200922.12.oe1.aarch64.rpm
wget https://archives.openeuler.openatom.cn/openEuler-20.09/OS/aarch64/Packages/libgfortran-9.3.1-20200922.12.oe1.aarch64.rpmdnf remove gccrpm -Uvh --force *.rpm

综上应该是和gcc有关,查看 gcc10的 changelog 

GCC 10 Release Series — Changes, New Features, and Fixes- GNU Project

That documents the change in default behaviour from -fcommon (before 10.1.0) to -fno-common (10.1.0 onwards). 

 GCC now defaults to -fno-common. As a result, global variable accesses are more efficient on various targets. In C, global variables with multiple tentative definitions now result in linker errors. With -fcommon such definitions are silently merged during linking.

关于 gcc 编译选项 -fcommon    -fno-common的解释:

-fcommon
In C code, this option controls the placement of global variables defined without an initializer, known as tentative definitions in the C standard. Tentative definitions are distinct from declarations of a variable with the extern keyword, which do not allocate storage.

The default is -fno-common, which specifies that the compiler places uninitialized global variables in the BSS section of the object file. This inhibits the merging of tentative definitions by the linker so you get a multiple-definition error if the same variable is accidentally defined in more than one compilation unit.

The -fcommon places uninitialized global variables in a common block.This allows the linker to resolve all tentative definitions of the same variable in different compilation units to the same object,  or to a non-tentative definition. This behavior is inconsistent with C++, and on many targets implies a speed and code size penalty on global variable references. It is mainly useful to enable legacy code to link without errors.

 

5 解决方法

编译前执行 export CFLAGS+=-fcommon

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件上传漏洞-上篇

一、概述 文件上传漏洞可以说是日常渗透测试中用得最多的一个漏洞&#xff0c;用它获得服务器权限最快最直接。在web程序中&#xff0c;经常需要用到文件上传的功能。如用户或者管理员上传图片&#xff0c;或者其它文件。如果没有限制上传类型或者限制不严格被绕过&#xff0c…

G1的收集流程

G1&#xff08;Garbage-First&#xff09;收集器的垃圾收集流程相对复杂&#xff0c;涉及多个阶段和算法。以下是G1收集器的基本收集流程&#xff1a; 初始标记阶段&#xff08;Initial Marking&#xff09;&#xff1a; 这是一个短暂的STW&#xff08;Stop-The-World&#xff…

大数据学习-Hive

介绍 分布式 SQL 计算 做数据的统计分析&#xff0c;SQL 是最方便的工具 在大数据中&#xff0c;有很多的统计分析场景&#xff0c;那么 SQL 来处理大数据是非常合适且频繁的 以后可能就是 SQL Boy 了&#xff0c;所以学习前需要有 MySQL 的基础 Hive 的功能 是一个分布式…

【软件测试入门】测试用例经典设计方法 — 因果图法

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、因果图设计测试用例的步骤 1、分析需求 阅读需求文档&#xff0c;如果User Case很复杂&am…

测试技术初阶

1.测试用例设计 黑盒测试用例 等价类边界值因果图判定表正交试验场景分析状态图错误推断 白盒测试用例 语句覆盖判定覆盖条件覆盖条件/判定覆盖条件组合覆盖修正判定条件覆盖点覆盖边覆盖路径覆盖 2基础体验评测 功能体验 完备性准确性易用性易学性展示样式任务路径竞手对比兼…

小程序业务逻辑回忆2

1.用户下单购票业务 购票业务中可购选4中票,普通票、学生票、vip贵宾票、指定日票。购票类型用ticket_id 进行区分,每种类型票用户都可以购买 n张,但是用户只能激活一张,其他票可用于转增。 用户下单购票时首先以user_id创建order表&#xff0c;然后用工具类生成订单号&…

k8s_服务发现专题

在 Kubernetes 中,服务发现(Service Discovery)是指如何在集群内不同的应用程序或服务之间找到并与其他服务通信。Kubernetes 提供了内置的服务发现机制,通过服务(Service)和 DNS 解析来实现。这使得在集群内部署和管理应用程序变得更加方便和高效。 我们带着以下问题开…

css恢复默认样式

重置样式为浏览器默认样式&#xff1b; .element-reset {all: revert;outline-style: revert !important;-webkit-appearance: revert !important; }<input type"button" value"跳转" class"element-reset" />

java构建一个OA审批系统

构建一个完整的OA审批系统涉及多个模块&#xff0c;包括用户管理、权限控制、审批流程设计以及前端界面等。以下是一个综合性的示例&#xff0c;展示了如何整合这些模块并实现基本功能。 ### 数据库设计 首先&#xff0c;定义一些基本的数据库表结构&#xff0c;用于存储用户…

芜湖市各地企业技术中心补助指南 附镜湖鸠江技术中心申报奖励+认定条件周期+流程

芜湖市各地企业技术中心申报周期 省企业技术中心的认定&#xff0c;原则上每年进行一次。各市经济和信息化主管部门根据省经济和信息化厅通知要求报送申请材料&#xff0c;受理截止日期以当年工作通知为准。 芜湖市各地企业技术中心补助汇编 市级&#xff08;2023年兑现政策…

电商项目测试实战之购物车页面用例设计

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、购物车页面 二、购物车页面测试范围列表 三、购物车页面功能点需求分析 四、部分功能点的测试…

vscode CMAKE 配置调试

概述 记录使用VSCODE中的CMAKE拓展构建项目时出现的报错 CMakePresets.json&#xff1a; {"version": 6,"configurePresets": [{"name": "x64-debug","displayName": "x64-debug","cmakeExecutable":…

Hi3861 OpenHarmony嵌入式应用入门--中断按键

本篇讲解gpio的中断使用方式。 硬件原理图如下&#xff0c;与上一篇一样的电路 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_…

cefsharp 修改请求头request.Headers,以实现某种请求验证(v100+已测试)含主要源码和注释

(一)目的:cefsharp实现修改请求头 Tip:网上搜的很多代码都无法实现(要么版本较低,方法有变,要么就行不通),较多的错误是:集合属性只读。其中一个bili网友的测试方法注解一张图,但没有具体代码。参考一下。 (二)实现方法 2.1 创建对象 ChromiumWebBrowser home…

数据库精选题(二)(引言+关系代数)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据库 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 常见概念 一、什么是数据库&#xf…

axi4 总线之 axi-full 学习记录

ARSIZE&#xff1a;读突发大小&#xff0c;给出每次突发传输的字节数支持 1、2、4、8、16、32、64、128 ARSIZE 字节数3b00013b00123b01043b01183b100163b101323b110643b111128 ARLEN&#xff1a;8 位&#xff0c;读传输的突发长度。 AXI3 只支持1~16次的突发传输&#xff08;B…

【Git】撤销远程仓库的提交(push)

参考&#xff1a;Git 撤销远程仓库的提交&#xff08;push&#xff09;和本地仓库的提交&#xff08;commit&#xff09;_git 撤销远程提交-CSDN博客 git reset --soft 想要撤销后的版本号 git push origin master -f soft 要撤销的本地代码不会变化&#xff0c;只是git仓库指…

神舟电脑怎么清理缓存文件?介绍几种简单有效方法

随着日常使用神舟电脑的时间增长&#xff0c;各种缓存文件、临时文件以及无用的数据会逐渐堆积&#xff0c;这不仅占据了宝贵的磁盘空间&#xff0c;还可能拖慢系统的运行速度&#xff0c;影响我们的使用体验。因此&#xff0c;定期清理神舟电脑中的缓存文件变得至关重要。本文…

Vue3插件安装

一、volar插件安装 volar&#xff1a;Vue文件的语法提示和高亮提醒。volar已经更名为Vue - Official&#xff0c;其安装步骤如下。 (1)打开vscode&#xff0c;点击扩展面板&#xff0c;在搜索窗口中输入volar&#xff0c;选择Vue - Official进行安装。 &#xff08;2&#xff0…

hpcpack指定节点计算

HPCPack是微软的高性能计算(HPC)解决方案之一&#xff0c;它可以用于在指定的集群节点上进行计算任务。在使用HPCPack时&#xff0c;你可以通过指定节点名称来限制任务运行的位置。 以下是一个示例&#xff0c;展示了如何在HPCPack作业脚本中指定节点计算&#xff1a; <?…