我有一个主文件,它调用共享库中定义的函数。
// 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
调用行(。