如何阻止 g++ 链接不需要的异常处理代码?

2023-11-24

我正在使用为arm-eabi 编译的GCC/G++ 开发嵌入式应用程序。由于资源限制,我尝试禁用标准 C++ 异常处理。我正在用“-fno-exceptions”编译代码 -nostartfiles -ffreestand”。

当一个类的全局实例存在,并且该类包含另一个类的实例作为成员时,就会链接很多异常处理代码。这不会那么糟糕,除了它还引入了很多异常处理代码。 stdio 的东西,比如 printf、fopen、fclose 和其他 FILE 函数。这个应用程序没有文件系统,即使有,这些函数也浪费了太多的代码空间。

据我了解,即使使用 -fno-exceptions,G++ 也会链接到使用异常的运算符 new,因为该库没有非异常使用运算符 new(除了 new(nothrot))。我创建了 new 和 delete 运算符的替代品,并将它们链接到输出以及不需要的标准库函数中。

让我困惑的是我没有在任何地方调用 new 。仅当全局对象包含另一个对象时,所有这些代码才会链接到其中。

例如:

class UartA {
...
private:
  Ringbuffer* rxbuf;
};

class UartB {
...
private:
  Ringbuffer rxbuf;
};

如果创建了 UartA 的全局实例,则不会链接异常处理、operator new 和 stdio 内容。这就是我想要的。

如果创建了 UartB 的全局实例(其中 rxbuf 是实例而不是指针),则会链接不需要的代码。

UartA和UartB都不使用operator new、exception或stdio。它们的区别仅在于 rxbuf 的类型。

您能建议如何防止链接额外的代码吗?另外,为什么它被链接到 UartB,而不是 UartA?


因为您基本上正在做操作系统开发人员为获得独立的 c 或 c++ 环境而要做的事情。您可能想考虑仅使用自定义链接器脚本。您只需要小心,因为像全局构造函数这样的事情不再自动发生......但是您也不会得到任何您没有明确要求的东西(并且编写调用全局构造函数的代码并不难)。这是我的操作系统中的链接器脚本。

OUTPUT_FORMAT("elf32-i386")
ENTRY(start)

virt = 0xc0100000; /* 3.1 gig */
phys = 0x00100000; /* 1 meg */

SECTIONS
{ 
    .text virt : AT(phys) 
    {
        code = .; _code = .; __code = .;
        *(.text)
        *(.gnu.linkonce.t*)
        . = ALIGN(4096); 
    }

    .rodata : AT(phys + (rodata - code))
    {
        rodata = .; _rodata = .; __rodata = .;
        *(.rodata*)
        *(.gnu.linkonce.r*)
        __CTOR_LIST__ = .;
        LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) 
        *(.ctors) 
        LONG(0) 
        __CTOR_END__ = .; 

        __DTOR_LIST__ = .; 
        LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) 
        *(.dtors) 
        LONG(0) 
        __DTOR_END__ = .; 
        . = ALIGN(4096); 
    }

    .data : AT(phys + (data - code))
    {
        data = .; _data = .; __data = .;    
        *(.data)
        *(.gnu.linkonce.d*)
        . = ALIGN(4096); 
    }

    .tbss : AT(phys + (tbss - code)) 
    {
        tbss = .; _tbss = .; __tbss = .;
        *(.tbss)
        *(.tbss.*)
        . = ALIGN(4096); 
    }

    .bss : AT(phys + (bss - code)) 
    {
        bss = .; _bss = .; __bss = .;
        *(.bss)
        *(.bss.*)
        *(COMMON)
        *(.gnu.linkonce.b*)
        . = ALIGN(4096); 
    }

    end = .; _end = .; __end = .;
}

它的功能可能超出您的需要(将部分与 4k 边界对齐,所有符号都大于 3GB 标记),但它是一个很好的起点。

你可以这样使用它:

ld -T link_script.ld *.o -lc -o appname

如果您想要的话,“-lc”也应该链接到 libc 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何阻止 g++ 链接不需要的异常处理代码? 的相关文章

  • ASP Core HttpClientFactory 模式使用客户端证书

    任何人都知道在使用时如何使用客户端证书HttpClientFactory 在我发现的所有示例中 您需要提供HttpMessageHandler in the HttpClient构造函数 使用时不可用HttpClientFactory se
  • 如果两个线程同时访问同一个 bool 变量会发生什么?

    我有一个跨平台 C 程序 其中使用 boost 库创建异步计时器 我有一个全局变量 bool receivedInput false 一个线程等待并处理输入 string argStr while 1 getline cin argStr
  • C++ 和序列化:有什么方法可以进行某种内省吗?

    我读过一些例子维基百科 http en wikipedia org wiki Type introspection C 2B 2B但我正在寻找一些现实生活中的例子 如何使用内省 为什么 它有助于编写干净的代码 以及代码本身 例如 有没有办法
  • 比较 LINQ to SQL 中的两个日期

    我有一个数据库 其中有一个名为会议的表 会议日期使用以下格式存储在此表中 May 2nd 2011 例如 格式为5 2 2011 我的要求是获取两个日期 例如 2011 年 4 月 25 日和 2011 年 5 月 2 日 之间的会议 并编
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • std::tr1::function 和 std::tr1::bind

    我在使用时遇到问题veryC 类中的复杂 C 函数 重写 C 函数是not一个选项 C函数 typedef void integrand unsigned ndim const double x void fdata unsigned fd
  • 我的 WPF 应用程序未触发 MainWindow_Loaded

    我目前正在关注Pluralsight C Fundamentals Part 1并在Classes and Objects视频部分指导我在 Visual Studio 中创建一个新的 WPF 应用程序并填写代码 这导致以下结果 namesp
  • 为什么我不能从对中返回 unique_ptr?

    为什么我不能从对中返回 unique ptr include
  • 以编程方式运行 T4 文本模板

    有没有一种方法可以通过代码以编程方式运行 T4 文本模板 我正在制作一种自定义域特定语言 我希望相关的文本模板在用户每次保存时运行 目前 这就是我在 DSL 模型中所做的事情 protected override void OnDocume
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 为什么我无法调试动态加载的程序集?

    我正在开发一个 Web API 项目 该项目使用内部模拟框架 允许拦截和修改来自控制器的响应 它使用 MEF 加载包含某些先决条件匹配时执行的代码的程序集 我知道这是正常工作的 因为我可以在响应中看到模拟已被执行 但由于某种原因我无法调试动
  • Gridview 错误:对 Bind 的调用格式不正确

    我有以下 gridview 代码
  • 将多个 Blob 输入传递到 QueueTrigger Azure 函数的最佳方法

    问题 触发后 生成 3 个 XML 文件 完成后将它们通过 ftp 传输到站点 目前的方法 我有一个 HTTP 触发器 Azure 函数 运行时将构造 3 个 XML 文件并将它们保存到 Azure 存储 Blob 容器中 由于有多个输出
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使

随机推荐

  • 无法从 Visual Studio 2015 连接到 mysql

    所以我已经花了大约 2 天的时间尝试解决这个问题 我已经在我的工作场所电脑上成功修复了这个问题 但无法让它在我的家庭电脑上工作 我读过十几篇 SO 文章和 Oracle 论坛文章等等 但它仍然不起作用 我有用于 Visual Studio
  • 可视化点云

    我在找到的视差图像上有来自 gpu reprojectImageTo3D 的 3D 点 我现在想显示这个点云 如何将找到的点云转换为OpenCV to sensor msgs PointCloud2 我不需要发布点云 这仅用于调试可视化 是
  • 访问令牌中缺少“aud”声明

    由于我未知的原因 aud 声明不存在于访问令牌中 尽管它存在于 id 令牌中 将访问令牌发送到 API 后 我收到以下错误 持有者未经过身份验证 失败消息 IDX10214 观众 验证失败 观众 空 不匹配 validationParame
  • Flutter 2:无法确定捆绑的 Java 版本

    我在 Windows 10 下使用 Android Studio 来运行 flutter 项目 但是我有这个警告我想修复 X Unable to determine bundled Java version Try updating or
  • 在javascript中将指数表示法小数位限制为4

    如何在 JavaScript 中使用这种类型的值将小数位限制为 4 e 是指数 因为我使用的是十个值的幂 toFixed 似乎不起作用 1 0531436913408342e 7 5 265718456704172e 7 8 4251495
  • CSS Flexbox 影响 Bootstrap 3 布局

    我正在尝试在 Bootstrap 3 中创建下面的布局 我可以实现 sm 下显示的布局 并且使用 Flexbox 我想将 div 1 和 2 交换为 xs 屏幕 问题是 当我将包含的 div 设置为 Flexbox 时 它会将 sm 布局上
  • 使用 ContentProvider 时出现“错误代码 5:数据库已锁定”

    我有一个应用程序 它在启动并绑定到该活动的单独进程中运行带有服务的活动 该服务包含一个处理程序 该处理程序发布一个可运行对象以在延迟后运行 我希望每个组件都登录到数据库 因此我实现了一个处理数据库访问的内容提供程序 并通过扩展的 Async
  • Chrome 中“此网页有重定向循环”,但在 FF 和 IE 上工作正常?

    这一页http www japanforum com forum japanese language help 39454 tara past tense clause html可以使用 FireFox IE Safar Opera 访问
  • 无法将 Angular 从版本 6 降级到版本 5

    最近 2018 年 5 月 更新的 Angular 稳定版本已经发布 我已成功从版本 5 迁移到版本 6 但由于某种原因我想回滚到版本 5 我尝试过以下命令 npm uninstall g angular cli 它卸载了最新版本的 Ang
  • 如何在没有匿名类型的情况下按多个字段进行 LINQ 区分

    我有一个名为CLASS与田野 BATCH DEGREE DEPT SEM SECTION GROUP 我有以下记录 记录1 2009 B E CSE 3 Sem Sec 1 Group 记录2 2009 B E CSE 3 Sem Sec
  • PHP 中的 RGB 到 HSV

    在 PHP 中 将 RGB 三元组转换为 HSV 值的最直接方法是什么 这是一个简单 直接的方法 它以度数和百分比的形式返回 HSV 值 这就是 Photoshop 的颜色选择器所使用的方法 请注意 返回值不会四舍五入 如果需要 您可以自行
  • 可以在 Excel VBA 中全局声明工作表对象吗?

    我正在重构 Excel 2003 工作簿中的多个模块 并且在每个模块的每个过程中声明相同的工作表集 我只想在全球范围内声明一次 我可以将工作表名称设置为文字 例如 Public Const xlwkGSModel gs model As S
  • Numpy:与唯一坐标位置对应的值的平均值

    所以 我已经浏览 stackoverflow 很长一段时间了 但我似乎找不到解决我的问题的方法 考虑一下这个 import numpy as np coo np array 1 2 2 3 3 4 3 4 1 2 5 6 1 2 value
  • Android的bulkTransfer在读取数据时返回-1,但缓冲区中确实有一些数据

    我在 Galaxy Tab p7300 中编写了一个应用程序 通过 otg 电缆与密钥 scsi 设备 进行通信 我第一次可以使用bulkTransfer 读取数据 但下次就不能了 然后我使用 Ellisys Visual USB 嗅探数据
  • Blazor 路线在同一页面发生变化

    我当前的设置 NET Core 3 预览版 6 Blazor 服务器端渲染 在 Blazor 页面中 我有类似以下内容 page page page page Id With Parameter public string Id get s
  • 如何在RDLC中设置参数值

    我在报告中添加了两个用于日期范围的文本框 为了填充文本框中的值 我为文本框设置了参数 现在 日期范围来自名为 DateRange 的表单 该表单具有两个 DateTimePickers 如何将rdlc中文本框的值设置为等于这些DataTim
  • NSInteger 计数乘以 4?

    我不明白为什么这个 NSInteger 计数器会增加到数据库行真实值的 4 倍 也许这很愚蠢 但我真的不明白 到目前为止谢谢 NSInteger i i 0 for NSDictionary teil in gText NSLog teil
  • 相当于连接 Sum 的字符串

    我想要一个查询在第一行输出左表中的 ID 和连接表中的描述 Schema person id int role id int description varchar 100 personrole personid int roleid in
  • jquery ui 对话框在按钮和内容 div 上使用相同的类打开多个对话框

    我想通过在按钮和内容 div 上使用相同的类来打开多个对话框 下面的方法有效 但仅适用于第一次 jQuery helpDialog hide jQuery helpButton click function jQuery this next
  • 如何阻止 g++ 链接不需要的异常处理代码?

    我正在使用为arm eabi 编译的GCC G 开发嵌入式应用程序 由于资源限制 我尝试禁用标准 C 异常处理 我正在用 fno exceptions 编译代码 nostartfiles ffreestand 当一个类的全局实例存在 并且该