GCC:在GCC版本之间伪装

GCC:在GCC版本之间伪装,gcc,linux-kernel,version,driver,nvidia,Gcc,Linux Kernel,Version,Driver,Nvidia,这个问题是从这个问题中产生的 问题是Linux有一个NVidia驱动程序,是用gcc4.5编译的。内核是用GCC4.6编译的。嗯,由于GCCs之间的版本号差异,这些东西不起作用。(安装程序说驱动程序无法工作-有关详细信息,请访问上面的链接) 是否可以将使用GCC4.5编译的二进制文件伪装成使用GCC4.6编译的二进制文件?如果可能的话,在什么情况下它会工作得很好?您的问题称为ABI:应用程序二进制接口。这是一组规则(除其他外),其中包括一段代码中的函数如何获取其参数(排序、堆栈上类型的填充)、函

这个问题是从这个问题中产生的

问题是
Linux
有一个
NVidia
驱动程序,是用
gcc4.5
编译的。
内核
是用
GCC4.6
编译的。嗯,由于
GCCs
之间的版本号差异,这些东西不起作用。(安装程序说驱动程序无法工作-有关详细信息,请访问上面的链接)


是否可以将使用
GCC4.5
编译的二进制文件伪装成使用
GCC4.6
编译的二进制文件?如果可能的话,在什么情况下它会工作得很好?

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

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

例如,这意味着旧/新代码无法再正确地使用此功能读取结构。如果混合使用4.4之前和之后的版本,数据损坏将不会发生任何崩溃

4.6发行说明中没有任何迹象表明ABI发生了变化,但Linux内核不知道这一点——它只是读取用于编译代码的编译器版本,如果前两个数字发生变化,它会假设运行代码是不安全的

有两种解决方案:

> p>可以编译与内核相同的编译器的英伟达驱动程序。strong>强烈建议这样做

  • 您可以在二进制文件中修补版本字符串。这将诱使内核加载模块,但有可能导致内部数据结构的数据损坏


  • 在拒绝加载或崩溃或…?为什么不用GCC4.5重新编译内核?让我提一下,最初的问题不是我的。安装程序说版本不合适。我在UNIX/Linux站点上建议重新编译内核,但我很好奇没有它怎么解决这个问题。将此视为一个抽象问题:如果我们将$progname.$gccversion1伪装成$progname.$gccversion2,那么$progname.$gccversion1什么时候可以工作?更重要的是内核和驱动程序是用相同的gcc版本编译的,还是驱动程序和程序,或者所有3个都需要相同的版本?重要的是所有三个都用相同的ABI编译。您可以使用4.6编译内核,使用4.7编译程序,而不会出现问题。