Path: utzoo!attcan!uunet!mcsun!ukc!icdoc!qmw-cs!liam From: liam@cs.qmw.ac.uk (William Roberts) Newsgroups: comp.unix.aux Subject: Shared libraries Keywords: Have they been used widely? How to compile with them? Message-ID: <2631@sequent.cs.qmw.ac.uk> Date: 10 Aug 90 19:28:53 GMT Organization: Computer Science Dept, QMW, University of London, UK. Lines: 94 I am currently trying to shoehorn a workable A/UX root partition into 10 Megabytes (well, it keeps me off the streets). During this exercise, I have noticed that some binaries are nice and small, whilst others are quite a lot larger for not much more functionality. For example: A/UX 2.0 SunOS 3.5 /bin/chmod 3604 bytes 19292 bytes (+15688) /bin/chgrp 32812 bytes 46620 bytes (+13808) The A/UX 2.0 version is using the shared libc, but so is the chgrp and I don't understand why it is so much bigger. When I do a "what" on these files, I get /bin/chmod: Copyright (c) 1984-85 AT&T-IS, 1985-87 UniSoft Corporation, All Rights Reserved. {Apple version 1.3 89/10/10 08:10:18} compatmode.c 1.2 /bin/chgrp: Copyright (c) 1984-85 AT&T-IS, 1985-87 UniSoft Corporation, All Rights Reserved. {Apple version 1.4 90/03/16 13:34:16} compatmode.c 1.2 get_myaddress.c 1.1 86/09/24 Copyr 1984 Sun Micro The curious thing is that "get_myaddress.c" is part of libc.a, and this is supposed to be shared.... isn't it? Turning to my trusty BSD 4.2 source code, I try compiling chmod.c and chgrp.c, only to discover that I can't seem to match the size that the distributed /bin/chmod achieves. Furthermore, there are no clear examples in the A/UX 2.0 distribution (online manuals only) to say exactly HOW to compile and link for shared libraries. Looking at the files with "size", I get Size of /bin/chgrp: 83988 Section Size Physical Address Virtual Address .text 26596 328 328 .data 5824 4196652 4196652 .bss 16160 4202476 4202476 .lbt1206 26156 1206910976 1206910976 .lbd1207 9108 1207697408 1207697408 .lbb1207 80 1207706516 1207706516 .lib 64 0 0 Size of /bin/chmod: 38972 Section Size Physical Address Virtual Address .text 2036 328 328 .data 1176 4196668 4196668 .bss 352 4197844 4197844 .lbt1206 26156 1206910976 1206910976 .lbd1207 9108 1207697408 1207697408 .lbb1207 80 1207706516 1207706516 .lib 64 0 0 So chgrp is bigger by 24000 bytes of text and 4700 bytes of data. The sizes of the chmod.o and chgrp.o files are chmod.o text=1284 data=156 chgrp.o text= 852 data=188 so all that extra is coming from unshared text & data extracted from libc. Running "strings /bin/chgrp | wc" shows that there are 3771 bytes of printable string (or thereabouts), most of which is the standard error strings used by perror: chgrp uses perror, chmod doesn't. Can anyone at Apple shed any light on all this? Have I just found a way to make the A/UX 2.0 distribution smaller by 20k for most of the 729 "executable" things listed in /FILES (a modest saving of 14 Meg!)? PS: gcc makes all string constants part of the text segment (and hence non-writeable) by default. The same effect could be achieved with ld (I think) and would be valuable if applied to errlst.c in the C library - this just defines the standard error strings and would put that 2492 bytes of data into somewhere that is truly shared rather that "copy-on-write" shared. This treatment of string constants would be useful in lots of places - just type "strings" on any executable over 40K... -- William Roberts ARPA: liam@cs.qmw.ac.uk Queen Mary & Westfield College UUCP: liam@qmw-cs.UUCP Mile End Road AppleLink: UK0087 LONDON, E1 4NS, UK Tel: 071-975 5250 (Fax: 081-980 6533)