From: Maarten B. <sou...@ds...> - 2007-11-22 12:54:30
|
Hi Jesus, Patryk, As far as I know Patryk is right, in C global variables have external linkage (non-static) by default. But the Borland compiler does not make them static either I think. It does not prevent a third source file to declare these globals 'extern' and then use them. It would just take the one or the other and warn you about that. IMHO it should even be an error instead of a warning. The other two seem to treat the second definition as an extern declaration only and locate these globals only once. I have no idea if their linkers do any type checking or how they would handle multiple initialisers. SDCC's linker does no type checking and would just insert both initialisers I think. Currently SDCC's linker generates an error when it finds two public definitions with the same symbol name unless they happen to be at the same address. But this address usually is a relative address in the segment part in the current module. The linker concatenates these segment parts to form the whole segment and thus these relative addresses are offset by the sizes of the previous parts. The result is that the two symbols get different addresses. If the search order was altered they could probably all get the same address, but the second instance would still be allocated and become an orphan. And as an aside. The function prototype for bb() should be outside of main(). Maarten > Hi Jesús, > > If I remember correctly, C and C++ differs about that: global object by > default is 'extern' in C and 'static' in C++. > > Regards, > Patryk > > ----- Original Message ----- > From: "Jesus Calvino-Fraga" <Je...@ec...> > To: <sou...@ds...>; "Development chatter about sdcc" > <sdc...@li...> > Sent: Thursday, November 22, 2007 5:20 AM > Subject: Re: [sdcc-devel] Help: [Bugs-1057171 ] Linker problem on multiple > defined global variable > > > Hi Maarten, > > I was a bit confused about this bug > report. Aren't global variables supposed to be > static outside the scope of the file where they > are declared? Apparently no, or maybe yes. I > have been checking the C89 standard and the "C" > book by K & R, and it isn't clear what should be > the behavior. Neither GCC nor MSVC 6 make global > variables static. Borland C++ 5.5.1 does! After > compiling/linking with GCC the two files below, > these are the results of running the executable(s): > > With MSVC (no warnings after compiling/linking): > > >cl aa.c bb.c > >aa > from aa.c: &a=00409af0, &b=00409af1, &c=00407030 > from bb.c: &a=00409af0, &b=00409af1, &c=00407030 > > With GCC (some unrelated warnings after compiling/linking): > > >gcc aa.c bb.c -o xx.exe > aa.c: In function `main': > aa.c:16: warning: return type of `main' is not `int' > >xx > from aa.c: &a=00405040, &b=00405050, &c=00403010 > from bb.c: &a=00405040, &b=00405050, &c=00403010 > > As you can see, a, b, and c are the same > variables both in aa.c and bb.c. When compiling > with Borland the results are more interesting: > > >bcc32 aa.c bb.c > Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland > aa.c: > Warning W8065 aa.c 20: Call to function 'bb' with no prototype in function > main > bb.c: > Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland > Warning: Public symbol '_c' defined in both module AA.OBJ and BB.OBJ > Warning: Public symbol '_a' defined in both module AA.OBJ and BB.OBJ > Warning: Public symbol '_b' defined in both module AA.OBJ and BB.OBJ > > >aa > from aa.c: &a=0040c4ac, &b=0040c4ad, &c=0040a128 > from bb.c: &a=0040c4b0, &b=0040c4b1, &c=0040c4b2 > > Borland kept the variables static in each > module! That is what SDCC is doing, but without > the warning! I am much in favor of this > behavior. If the variables in bb.c are changed > from char to say double (leaving the variable in > aa.c as char) neither MSVC nor GCC report any > problem! At least with Borland there is a hint that something may be > wrong. > > These are slightly modified versions of the two > files posted with the original bug report: > > ------- aa.c ------------ > #include <stdio.h> > #include <stdlib.h> > > char a, b; > char c=10; > > void aa() > { > a = b + c; > } > > void main() > { > void bb(); > > printf("from aa.c: &a=%08lx, &b=%08lx, &c=%08lx\n", &a, &b, &c); > bb(); > } > > ----- bb.c ------- > #include <stdio.h> > #include <stdlib.h> > > char a,b,c; > > void bb() > { > c = a+ b; > printf("from bb.c: &a=%08lx, &b=%08lx, &c=%08lx\n", &a, &b, &c); > } > --------------------- > > Jesús > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2005. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > sdcc-devel mailing list > sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-devel > > |