digitalmars.D.learn - why adding extern(C) cause a runtime error?
win7 x86 dmd2.067.1 ok ubuntu x64 dmd2.067.1 error ------------------------------------- import std.stdio; import std.socket; extern(C) void recv() { writeln("recv..."); } extern(C) void send() { writeln("send..."); } int main(string[] argv) { //copy from std.socket unittest immutable ubyte[] data = [1, 2, 3, 4]; auto pair = socketPair(); scope(exit) foreach (s; pair) s.close(); pair[0].send(data); auto buf = new ubyte[data.length]; pair[1].receive(buf); assert(buf == data); return 0; } ---------------------------------- send... recv... core.exception.AssertError a.d(27): Assertion failure ---------------- ./a() [0x43d61f] ./a(_Dmain+0xcc) [0x43d1bc] ./a(_D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+0x1f) [0x4400fb] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x44004e] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll()+0x30) [0x4400b4] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x44004e] ./a(_d_run_main+0x1dc) [0x43ffc8] ./a(main+0x17) [0x43d637] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f5fabd8fec5]
Jul 10 2015
On Saturday, 11 July 2015 at 01:22:14 UTC, mzfhhhh wrote:win7 x86 dmd2.067.1 ok ubuntu x64 dmd2.067.1 error ------------------------------------- import std.stdio; import std.socket; extern(C) void recv() { writeln("recv..."); } extern(C) void send() { writeln("send..."); } int main(string[] argv) { //copy from std.socket unittest immutable ubyte[] data = [1, 2, 3, 4]; auto pair = socketPair(); scope(exit) foreach (s; pair) s.close(); pair[0].send(data); auto buf = new ubyte[data.length]; pair[1].receive(buf); assert(buf == data); return 0; } ---------------------------------- send... recv... core.exception.AssertError a.d(27): Assertion failure ---------------- ./a() [0x43d61f] ./a(_Dmain+0xcc) [0x43d1bc] ./a(_D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+0x1f) [0x4400fb] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x44004e] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll()+0x30) [0x4400b4] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x44004e] ./a(_d_run_main+0x1dc) [0x43ffc8] ./a(main+0x17) [0x43d637] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f5fabd8fec5]You basically "overwrite" the C send(2) and recv(2) functions with your code (the actual symbols, the linker will yours instead the "real" ones). So std.socket doesn't call the C functions but yours. Yours obviously don't send and receive data. If you really want to "overwrite" these functions you might be able to call the original ones via dlsym.
Jul 11 2015