我正在尝试在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,但我仍然得到相同的错误。所有帮助将不胜感激。 谢谢
答案 0 :(得分:1)
我在使用VS2010作为编译器的Windows机器(WinXP 32位)上。这是我做的:
下载Windows
在汇编代码中将下划线添加到导出符号的名称中:
global _helloWorld
section .data
greeting: db "Hello, World", 0
section .text
_helloWorld:
mov eax, greeting
ret
按如下方式编译汇编代码:nasm -f win32 -o hello.obj hello.asm
,编译链接到生成的目标文件的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