如何更改从多个源文件编译的g ++生成的Linux共享库的入口点?

时间:2016-01-02 01:42:39

标签: c++ g++ ubuntu-14.04

今天,我阅读了网络博客文章http://rachid.koucha.free.fr/tech_corner/executable_lib.html,如何制作可执行的共享库。在本文中,它指出如果在Linux命令提示符下键入一个类型:

gcc -shared service.c -o libservice.so -Wl,-soname,libservice.so -W1,-e lib_entry

接着是

./libservice.so, then we can directly executer the lib_entry function.

但是,当我运行类似的g ++命令时:

g++ -shared one.cpp two.cpp three.cpp -o libservice.so -Wl,-soname,libservice.so -W1,-e lib_entry

其中lib_entryC中定义的two.cpp函数,我收到警告消息:

  

找不到入口点lib_entry点。

如何修复此警告消息,以便我可以直接运行入口点lib_entry?我是否应该将C函数foo的实现与extern "C"链接括起来以解决此问题?

2 个答案:

答案 0 :(得分:0)

这是我的答案: Missing include "bits/c++config.h" when cross compiling 64 bit program on 32 bit in Ubuntu

sudo apt-get install gcc-4.9-multilib g ++ - 4.9-multilib

答案 1 :(得分:-1)

请忽略之前的答案。以下答案已成功测试。感谢您的耐心等待。 第1步

#include <stdio.h>
#include <unistd.h>

#ifdef __LP64__
const char service_interp[] __attribute__((section(".interp"))) = "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2";
#else
const char service_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
#endif


void lib_service(void)
{

  printf("This is a service of the shared library\n");

} // lib_service
void lib_entry(void)
{
  printf("Entry point of the service library\n");
 _exit(0);
}

第2步。

vendor@clickit:~/Downloads/DataServerLib$ g++   -shared -fPIC -DLINUX -Wl,-soname,libdataserver.so -efunc  -I /home/vendor/Downloads/waitForMultipleObjects -I /home/vendor/development/Test/Include  DataServer.cpp DataServerLib.cpp DataTransferClient.cpp CWinEventHandle.cpp WinEvent.cpp -o libDataServer.so -lpthread -lrt
maryych@uwash.edu:~/Downloads/DataServerLib$ chmod 777 libDataServer.so
maryych@uwash.edu:~/Downloads/DataServerLib$ ./libDataServer.so

内部入口点测试仪1 ADDUSER