以下是"可执行"共享库的最小示例(假定文件名:)mini.c:
// Interpreter path is different on some systems
//+definitely different for 32-Bit machines
const char my_interp[] __attribute__((section(".interp")))
= "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2";
#include
#include
int entry() {
printf("WooFoo!\n");
exit (0);
}
如果用例如:编译它gcc -fPIC -o mini.so -shared -Wl,-e,entry mini.c."运行"结果.so将如下所示:
confus@confusion:~$ ./mini.so
WooFoo!
我现在的问题是:
如何更改上述程序以将命令行参数传递给.so-file 的调用?更改后的示例shell会话可能如下所示:
confus@confusion:~$ ./mini.so 2 bar
1: WooFoo! bar!
2: WooFoo! bar!
confus@confusion:~$ ./mini.so 3 bla
1: WooFoo! bla!
2: WooFoo! bla!
3: WooFoo! bla!
5: WooFoo! Bar!
在编译时检测也是很好的,目标是32位或64位二进制文件,以相应地更改解释器字符串.否则,会收到"访问已损坏的共享库"警告.就像是:
#ifdef SIXTY_FOUR_BIT
const char my_interp[] __attribute__((section(".interp"))) = "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2";
#else
const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
#endif
或者甚至更好,完全自动检测适当的路径,以确保编译库的系统是正确的.