SytemC on CentOS 5.3 64bit

系统环境

  • CentOS 5.3 64bit
  • gcc 4.1
  • SystemC 2.2

操作目的

  • 将SystemC模块编译为.so由外部程序调用

出现故障

  • 编译的时候gcc显示需要将libsystemc.a使用-fPIC开关进行编译,同时显示模块找不到符号。

故障原因

  • 为了将SystemC模块打入.so需要将libsystemc.a编译为PIC代码。gcc4默认情况下不再启用-fPIC开关。

解决方法

  • 打开configure.in文件,在针对Linux x86_64平台下的-Wall开关后面加上-fPIC。执行config目录下的distinstall和boostrap脚本生成新的配置。然后正常./configure、make、make install、make clean。

实战演练

  • 声明一个名字叫做Trust的.so,然后在外部程序中执行这个.so(其实就是手动执行.so中的函数)。两个文件代码如下。
代码
#include <iostream>
#include 
<systemc.h>

using namespace std;

SC_MODULE(first_counter)
{
    SC_CTOR(first_counter){
        cout
<<"Trust"<<endl;
    }
};

int sc_main(int argc, char* argv[])
{
    cout
<<"sc_main running!"<<endl;
    
for(int i=0; i<argc; ++i)
    {
        cout
<<'\t'<<argv[i]<<endl;
    }
    first_counter c1(
"c1");
    
return 0;
}


#define EXPORT __attribute__((visibility("default")))

extern "C"
{
    EXPORT
    
void Fork(int n, int m)
    {
        
char** argv = (char**)malloc(sizeof(void*)*2);

        
char buf[256];

        sprintf(buf,
"%d",n);
        argv[
0= strdup(buf);

        sprintf(buf,
"%d",m);
        argv[
1= strdup(buf);

        sc_main(
2,argv);
        
        free(argv[
0]);
        free(argv[
1]);
        free(argv);
    }
}




代码
#include <dlfcn.h>
#include 
<iostream>

using namespace std;

typedef 
void (*PFNVOIDINT)(int,int);

int main(int argc, char* argv[])
{
    
void* Handle = dlopen("/home/Bo/Projects/Trust/libTrust.so",RTLD_LAZY);

    PFNVOIDINT ForkFunc 
= (PFNVOIDINT)dlsym(Handle,"Fork");

    
if( ForkFunc )
        ForkFunc(
1234567890,1122334455);

    dlclose(Handle);
    
return 0;
}

执行结果完全正常,参数正确传入SystemC的模块.so内。

原文地址:https://www.cnblogs.com/Jedimaster/p/1653034.html