使用与使用nasm汇编的对象链接的matlab对C代码进行mex化时出错

时间:2013-08-21 20:30:30

标签: c matlab assembly nasm mex

我正在尝试在Matlab中对C代码进行mexify,这与我使用nasm汇编的对象相关联。当我尝试对代码进行mexify时,我收到了来自Matlab的错误。这是我用来代码化的命令:

    mex main.c hello.o

这是C代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include "mex.h"

    extern char * helloWorld();

    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])  {
        char * sentence = helloWorld();
        printf("%s\n", sentence);
    }

这是汇编代码:

    global helloWorld

    section .data
        greeting: db "Hello, World", 0
    section .text
    helloWorld:
        mov eax, greeting
        ret

我用来汇编代码的命令是:

    nasm -felf64 -gdwarf2 -o hello.o hello.asm

这是我尝试使用C代码时收到的错误:

    /usr/bin/ld: hello.o: relocation R_X86_64_32 against `.data' can not be used
    when making a shared object; recompile with -fPIC
    hello.o: could not read symbols: Bad value
    collect2: ld returned 1 exit status

nasm没有-fPIC标志。我尝试使用get_GOT宏以及默认的rel,但我仍然得到相同的错误。所有帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:1)

我在使用VS2010作为编译器的Windows机器(WinXP 32位)上。这是我做的:

  • 下载Windows

  • 的NASM汇编程序
  • 在汇编代码中将下划线添加到导出符号的名称中:

    global _helloWorld
    
    section .data
        greeting: db "Hello, World", 0
    section .text
    _helloWorld:
        mov eax, greeting
        ret
    
  • 按如下方式编译汇编代码:nasm -f win32 -o hello.obj hello.asm

  • 在MATLAB中
  • ,编译链接到生成的目标文件的MEX文件:

    >> mex main_mex.c hello.obj
    

    正如我所说,mex之前已配置为使用Visual Studio 2010进行编译。

    #include <stdio.h>
    #include <stdlib.h>
    #include "mex.h"
    
    extern char* helloWorld();
    
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
        char *sentence = helloWorld();
        mexPrintf("%s\n", sentence);
    }
    
  • 运行MEX功能:

    >> main_mex
    Hello, World
    

编辑:

在64位Windows上,我做了以下更改:

bits 64        ; specify 64-bit target processor mode
default rel    ; RIP-relative adresses

section .text
global helloWorld      ; export function symbol (not mangled with an initial _)
helloWorld:
    mov rax, greeting  ; return string
    ret

section .data
    greeting: db "Hello, World", 0

然后:

>> !nasm -f win64 -o hello.obj hello.asm
>> mex -largeArrayDims hello_mex.c hello.obj
>> hello_mex
Hello, World