RM B.3.1 (1) may have something important to say by what it does _not_ say, viz. : The package Interfaces.C.Strings declares types and subprograms allowing an Ada program to allocate, reference, update, and free C-style strings. In particular, the private type chars_ptr corresponds to a common use of �char *� in C programs, and an object of this type can be passed to a subprogram to which pragma Import(C,...) has been applied, and for which �char *� is the type of the argument of the C function. What is does _not_ say is that an object of this type can be passed to a subprogram to which pragma Export(C,...) has been applied, and for which �char *� is the type of the argument of the C function. So... the question is.. if one wishes to have a procedure with a profile of, say: procedure My_Proc (Result : out Interfaces.C.Strings.Chars_Ptr); is it legal to export it like so: pragma Export (C, My_Proc, "My_Proc"); where the C prototype is void My_Proc (char * result); The results I'm having are that if the exported procedure is called from Ada, everything works as expected. If called from C, a Segmentation fault occurs at the point where the out mode parameter is assigned its value in the Ada procedure My_Proc. What say ye?