On 28 January 2017 at 15:10, Lakshay Garg wrote: >> I do this: >> >> $ gcc f1.c f2.c -Wall >> /usr/local/bin/ld: Warning: alignment 4 of symbol `c' in f2.o is smaller than 8 in f1.o >> /usr/local/bin/ld: Warning: size of symbol `c' changed from 8 in f1.o to 4 in f2.o >> >> You should always use -Wall when gcc does anything unexpected. >> > > Hi Andrew > > Yes, I get this warning too. But what I want to understand is why do > we get the size of c as 8 when it should be 4 because the linker will > find that there are multiple declarations of c and will keep the > strong one which is the declaration with int. You lied to the compiler, so you have no right to expect any sane behaviour. You told the compiler that the object 'c' has type int, but then in the complete program it has type double instead. Don't lie to the compiler. If you lie and say it has type int, then when you ask for its size you get an answer based on a lie. > Please see slides 22,23,24 from here: > https://www.cs.cmu.edu/afs/cs/academic/class/15213-f10/www/lectures/11-linking.pdf Those slides seem highly misleading to me, and what they describe as "Evil!" and "Nasty!" are not valid C, and make your whole program undefined. Do not do that.