Xref: utzoo comp.lang.c:13772 comp.sys.ibm.pc:20809 Path: utzoo!attcan!uunet!mcvax!hp4nl!eurtrx!euraiv1!evas From: evas@euraiv1.UUCP (Eelco van Asperen) Newsgroups: comp.lang.c,comp.sys.ibm.pc Subject: MSC v5.1 bug; variable not made public Keywords: C,Microsoft,lib,link,TurboC Message-ID: <792@euraiv1.UUCP> Date: 1 Nov 88 23:35:03 GMT Organization: Erasmus University EF/AIV,Rotterdam,Netherlands Lines: 100 Hi, I've just found a nice bug in MSC v5.1; if you declare an unitialized variable in a module that has no other publics and put that module in a library, the variable will _not_ be found by LINK. Here's a small example; File alfa.c: char alfa[1000]; proc_alfa() {} File beta.c: extern char alfa[]; main() { strcpy(alfa,"This is a bug !"); #ifdef CALL_ALFA proc_alfa(); #endif puts(alfa); exit(0); } compile this; cl -c alfa.c beta.c create a library; lib demo +alfa; and try to link; link /noi beta,,,demo; and bingo; Microsoft (R) Overlay Linker Version 3.65 Copyright (C) Microsoft Corp 1983-1988. All rights reserved. LINK : error L2029: Unresolved externals: _alfa in file(s): BETA.OBJ(beta.c) There was 1 error detected Now, I did not insert that #ifdef in beta.c for nothing; let's recompile with -DCALL_ALFA; cl -DCALL_ALFA -c beta.c link /noi beta,,,demo; and everything is fine. To determine what caused the error, I did the same for TurboC v1.5; tcc -c alfa.c beta.c lib demo +alfa; link \tc\lib\c0s beta,beta,,demo \tc\lib\cs; and hey, no errors ! I then used OBJSNOOP to peek in the OBJ-files to see what publics they contained and sure enough the TurboC version contained _alfa while the MSC version did not; TurboC: ---------- alfa.obj public _alfa public _proc_alfa MSC: ---------- alfa.obj extrn __acrtused extrn __chkstk extrn _proc_alfa public _proc_alfa The same thing happens if 'alfa' is an int; however, if you initialize 'alfa', then everything will work ok. For example; char alfa[] = "Just a test!"; Peeking with OBJSNOOP at ALFA.OBJ shows; ---------- alfa.obj extrn __acrtused extrn __chkstk extrn _proc_alfa public _alfa public _proc_alfa I realize that this is a pathetic example but I was bitten by it and it took me an hour to find why the *****y linker could not find two global arrays I had declared in a separate file with no other entries. (and then another half hour to document it, try alternatives and write this ;-) -- Eelco van Asperen. EUR/Rotterdam/Netherlands uucp: evas@eurtrx / mcvax!eurtrx!evas earn/bitnet: asperen@hroeur5 "We'd like to know a little bit about you for our files" - Mrs.Robinson, Simon & Garfunkel