这个问题出自this问题。
问题是有一个用于Linux的NVidia驱动程序,它是用GCC 4.5编译的。使用GCC 4.6编译kernel。嗯,这个东西不工作是因为GCCs之间的版本号不同。(安装程序说驱动程序无法工作-有关详细信息,请访问上面的链接)
可以将用GCC 4.5编译的二进制文件伪装成用GCC 4.6编译的二进制文件吗?如果可能,它在什么情况下会工作得很好?
发布于 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内核不能知道的-它只读取用于编译代码的编译器版本,如果前两个数字改变,它认为运行代码是不安全的。
有两种解决方案:
https://stackoverflow.com/questions/9680727
复制相似问题