首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC:在GCC版本之间的伪装

GCC:在GCC版本之间的伪装
EN

Stack Overflow用户
提问于 2012-03-13 16:43:58
回答 1查看 664关注 0票数 1

这个问题出自this问题。

问题是有一个用于LinuxNVidia驱动程序,它是用GCC 4.5编译的。使用GCC 4.6编译kernel。嗯,这个东西不工作是因为GCCs之间的版本号不同。(安装程序说驱动程序无法工作-有关详细信息,请访问上面的链接)

可以将用GCC 4.5编译的二进制文件伪装成用GCC 4.6编译的二进制文件吗?如果可能,它在什么情况下会工作得很好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-13 17:30:56

您的问题称为ABI:应用程序二进制接口。这是一组规则(其中包括)一段代码中的函数如何获取它们的参数(排序,堆栈上类型的填充),函数的命名以便链接器可以解析符号和结构中字段的填充/对齐。

GCC试图在不同的编译器版本之间保持ABI的稳定,但这并不总是可行的。

例如,GCC 4.4 fixed a bug in packed bit-fields,这意味着旧的/新的代码不能再正确地使用此功能读取结构。如果您混合了4.4之前和之后的版本,数据损坏将会发生,而不会发生任何崩溃。

在4.6发行说明中没有任何迹象表明ABI被改变了,但这是Linux内核不能知道的-它只读取用于编译代码的编译器版本,如果前两个数字改变,它认为运行代码是不安全的。

有两种解决方案:

  1. 您可以使用与内核相同的编译器编译Nvidia驱动程序。这是很强的,recommended
  2. You可以修补二进制文件中的版本字符串。这将诱使内核加载模块,但会冒着导致内部数据结构损坏的风险。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9680727

复制
相关文章

相似问题

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