如果我们想要修改程序使用的共享库中的函数定义,需要遵循的兼容性规则

问题描述 投票:0回答:1

我使用的是 Ubuntu x86_64 系统。

我有这个源文件 main.c,它使用共享库 libfx.so 中定义的 fx 函数:

int fx( int a, int b);

int main( void ){
     
    int x = fx( 50, 30 );
    return 0;

}

这是用于创建共享库的文件 fx.c 中 fx 的定义:

int fx( int a, int b){

    return a + b;

}

问题:

  1. 我们可以在内部随意修改函数定义而不会导致不兼容,这样说对吗?例如我们可以这样做:
int fx( int a, int b){

    return a - b;
}

int fx( int a, int b){

    if ( a > 10 ){
        
         return a + b;

    }else{
         
         return a - b;

    }
}
  1. 如果我们修改以下任何一项,就会出现不兼容性,这样说是否正确:

    返回类型

    函数名称

    参数个数

    参数类型

  2. 这些原则也适用于单个目标文件吗?例如,名为 A 的目标文件使用 B 中定义的函数

c linux gcc shared-libraries abi
1个回答
0
投票
  1. 我们可以在内部随意修改函数定义而不会导致不兼容,这样说对吗?

不完全是。修改函数定义不会导致传递参数或接收返回值出现任何问题,这是正确的。但是,更改函数的行为可能会更改调用函数的结果行为。

您提出的问题似乎是在特定的有限上下文中,可能只是专门询问调用接口的兼容性,而不是旨在包括行为兼容性。

  1. 如果我们修改以下任何一项,就会出现不兼容的说法是否正确:

返回类型

更改返回类型通常会导致接口不兼容。在某些有限的情况下,它不会,例如更改为兼容类型。

函数名称

更改函数名称常常会导致接口不兼容。在某些有限的情况下,它不会这样做,例如更改名称的尾随字符长于外部名称的重要部分。 (C 标准要求至少 31 个有效字符。)

参数个数

更改参数数量往往会导致接口不兼容。在某些有限的情况下,它不会这样做,例如减少调用例程负责与传递参数相关的堆栈管理的平台中的参数数量。 (换句话说,在某些平台上,调用例程可能会传递额外的参数,这些参数将被被调用例程忽略。)

参数类型

更改参数类型往往会导致接口不兼容。在某些有限的情况下,它不会这样做,例如更改为兼容类型。

这些原则也适用于单个目标文件吗?例如,名为 A 的目标文件使用 B 中定义的函数

是的。

© www.soinside.com 2019 - 2024. All rights reserved.