home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / sys / hp / 8646 < prev    next >
Encoding:
Internet Message Format  |  1992-07-28  |  3.2 KB

  1. Path: sparky!uunet!pmafire!news.dell.com!swrinde!mips!sdd.hp.com!hpscdc!cupnews0.cup.hp.com!hppad.waterloo.hp.com!hppad!hpfcso!mjs
  2. From: mjs@hpfcso.FC.HP.COM (Marc Sabatella)
  3. Newsgroups: comp.sys.hp
  4. Subject: Re: Problem with C++ or the loader
  5. Message-ID: <7371185@hpfcso.FC.HP.COM>
  6. Date: 28 Jul 92 22:14:23 GMT
  7. References: <1992Jul24.145817.27910@bnlux1.bnl.gov>
  8. Organization: Hewlett-Packard, Fort Collins, CO, USA
  9. Lines: 86
  10.  
  11. In comp.sys.hp, aharon@bnlux1.bnl.gov (Aharon Friedman) writes:
  12.  
  13. > I am trying to link a c++ code I am getting the following message:
  14. > ld: initialized data space not big enough for COMM declaration of gain
  15. > Where gain is a variable in one of the objects.
  16.  
  17. I posted the following reply to a similar question a few weeks ago:
  18.  
  19. In comp.sys.hp, bj@zephir.uucp (Beat Jucker) writes:
  20.  
  21. >     ld: initialized data space not big enough for 
  22. >         COMM declaration of _resourceList
  23. > Does someone know which parameters I have to change? I'm using HP-UX 8.0
  24. > and the standard K&R C-compiler coming with the system.
  25.  
  26. This message indicates an error in the program or one of the libraries, not a
  27. parameter that can simply be bumped up.  What has happened is that somewhere in
  28. your program or in one of the libraries was a declaration of the form
  29.  
  30.     <type1> resourceList;
  31.  
  32. and somewhere else there was a declaration of the form
  33.  
  34.     <type2> resourceList = <initializer>
  35.  
  36. where type1 is bigger than type2.  For instance,
  37.  
  38.     int resourceList;
  39.  
  40. and
  41.  
  42.     double resourceList = 3.14;
  43.  
  44. Or a more likely example,
  45.  
  46.     struct list resourceList;
  47.  
  48. and
  49.  
  50.     struct list *resourceList = &resourceListHead;
  51.  
  52. The linker is trying to tell you it is allocating enough space for the
  53. initialized definition, but the uninitialized one is bigger, and the source
  54. file that contains the bigger definition may well be expecting the larger
  55. allocation.
  56.  
  57. Note declarations with the keyword "extern" do not in fact define anything, so
  58. there are not germane.
  59.  
  60. To find all definitions of resourceList, try running
  61.  
  62.     nm *.[oa] | grep -v "0x00000000 U" | grep "_resourceList"
  63.  
  64. The lines are are screening out are the "extern" declarations; this leaves us
  65. with only true definitions.
  66.  
  67. Lines that look like
  68.  
  69.     0x00000004 U
  70.  
  71. are uninitialized definitions, where the number at left indicates the expected
  72. size.  Lines that look like
  73.  
  74.     0x00004F54 D
  75.  
  76. are initialized definitions, where the number at left indicates the address
  77. where the initial value is stored.  The size is *not* recorded; the linker
  78. guesses that by finding the initialized definition at the next higher address
  79. and subtracting addresses.  This should always overestimate and never
  80. underestimate, so you should never see the error message unless the initialized
  81. definition really is too small.
  82.  
  83. If you are having trouble finding the conflicting definitions using "nm", you
  84. might want to try the undocumented "-y" option to the 300/400 linker, which
  85. works as documented for the 700/800.  If you are using "cc" to link, specify
  86. "-Wl,-y,_resourceList".  This will show you where the linker is seeing all
  87. definitions and references to that symbol.
  88.  
  89. --------------
  90. Marc Sabatella (marc@hpmonk.fc.hp.com)
  91. Disclaimers:
  92.     2 + 2 = 3, for suitably small values of 2
  93.     Bill (H.) and Dave (P.) may not always agree with me
  94.