将编译和链接解耦为两个步骤



我有一个主文件,它调用共享库中定义的函数。

// main.c
int main()
{
int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];
addvec(x, y, z, 2);
}

共享库是以下代码

// addvec.c
void addvec(int *x, int *y, int *z, int n)
{
int i;
for(i = 0; i < n; ++i)
z[i] = x[i] + y[i];
}

我使用gcc -shared -fpic -nostdlib -o libevctor.so addvec.c创建了一个共享库。

然后我在没有链接的情况下编译了main.c。

gcc -c main.c -o main.o

最后,我把这两个部分联系起来:

ld -rpath=$PWD -dynamic-linker /lib/ld-linux.so.2 -m elf_i386 -e main main.o libvector.so -o prog

到目前为止一切都很好。但是,当我运行prog时,会出现分段故障。

此外,我用readelf代替prog,发现.dynsym中的addvec值为0:

symbol table '.dynsym' consists of 5 entries:
Num:  value:  Size   Type    Bind   Vis   Ndx   Name
0:   00000000   0     NOTYPE LOCAL  DEFAULT UND
1:   00000000   0     FUNC   GLOBAL DEFAULT UND addvec
2:   0804934c   0     FUNC   GLOBAL DEFAULT 10  __bss_start
....

我做错什么了吗?

通常您不应该显式使用ld(或gold或任何其他链接器(,因为调用行非常依赖于目标并且很脆弱。仅与gcc:链接

gcc -Wl,-rpath=$PWD -m32 main.o libvector.so -o prog

在您的特定情况下,可能缺少处理程序启动和libc设置的crt对象文件(添加-v以查看实际的ld调用行(。

相关内容

  • 没有找到相关文章

最新更新