[Issue 23387] New: ImportC: identical structs defined in two C files lead to duplicate .init symbol on macOS

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Oct 4 22:17:22 UTC 2022


https://issues.dlang.org/show_bug.cgi?id=23387

          Issue ID: 23387
           Summary: ImportC: identical structs defined in two C files lead
                    to duplicate .init symbol on macOS
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Mac OS X
            Status: NEW
          Keywords: ImportC, link-failure
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: dave287091 at gmail.com

This bug report is a little weird as it is contingent on an unmerged PR
(https://github.com/dlang/dmd/pull/14509), but I am filing it here before I
forget.

C structs will now be in the same module so the .init for structs collides
across different object files.

>From https://github.com/dlang/dmd/pull/14509#issuecomment-1266355604

// Dummy function definitions to make the example compile.
// freer.i
typedef struct Foo3 *FooRef3;
struct Foo3 {
    int x;
};
void free_foo3(FooRef3 foo){}
// maker.i
typedef struct Foo3 *FooRef3;
struct Foo3 {
    int x;
};
FooRef3 make_foo3(void){return 0;}

// do_foo.d
import maker;
import freer;

void main(){
     FooRef3 f = make_foo3();
     free_foo3(f);
}
 # Separate compilation makes
# the issue obvious.
$ dmd maker.i -c
$ dmd freer.i -c
$ dmd do_foo.d -c
$ dmd do_foo.o freer.o maker.o 
duplicate symbol '__D3__C4Foo36__initZ' in:
    freer.o
    maker.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Error: linker exited with status 1
$ nm freer.o
0000000000000010 B __D3__C4Foo36__initZ
0000000000000000 S _free_foo3
$ nm maker.o
0000000000000010 B __D3__C4Foo36__initZ
0000000000000000 S _make_foo3
$ echo "__D3__C4Foo36__initZ" | ddemangle
__C.Foo3.__init


Walter responded:

WalterBright commented 15 hours ago
The cause of the problem is a workaround for a linker problem:

https://github.com/dlang/dmd/blob/master/compiler/src/dmd/toobj.d#L524

--


More information about the Digitalmars-d-bugs mailing list