extern __gshared const(char)* symbol fails

Neia Neutuladh neia at ikeran.org
Fri Aug 31 17:18:58 UTC 2018


On Friday, 31 August 2018 at 06:20:09 UTC, James Blachly wrote:
> Hi all,
>
> I am linking to a C library which defines a symbol,
>
> const char seq_nt16_str[] = "=ACMGRSVTWYHKDBN";
>
> In the C sources, this is an array of 16 bytes (17 I guess, 
> because it is written as a string).
>
> In the C headers, it is listed as extern const char 
> seq_nt16_str[];
>
> When linking to this library from another C program, I am able 
> to treat seq_nt16_str as any other array, and being defined as 
> [] fundamentally it is a pointer.
>
> When linking to this library from D, I have declared it as:
>
> extern __gshared const(char)* seq_nt16_str;
>
> ***But this segfaults when I treat it like an array (e.g. by 
> accessing members by index).***

I believe this should be extern extern(C)? I'm surprised that 
this segfaults rather than having a link error.

A bare `extern` means "this symbol is defined somewhere else".

`extern(C)` means "this symbol should have C linkage".

When I try it with just `extern`, I see a link error:

scratch.o: In function `_Dmain':
scratch.d:(.text._Dmain[_Dmain]+0x7): undefined reference to 
`_D7scratch5cdataPa'
collect2: error: ld returned 1 exit status
Error: linker exited with status 1




More information about the Digitalmars-d-learn mailing list