From owner-freebsd-questions@freebsd.org Wed Oct 16 23:19:55 2019 Return-Path: Delivered-To: freebsd-questions@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 498F4152894 for ; Wed, 16 Oct 2019 23:19:55 +0000 (UTC) (envelope-from SRS0=vdX2=YJ=mail.sermon-archive.info=doug@sermon-archive.info) Received: from mail.sermon-archive.info (sermon-archive.info [71.177.216.148]) by mx1.freebsd.org (Postfix) with ESMTP id 46tpDB2T4kz4PhM for ; Wed, 16 Oct 2019 23:19:54 +0000 (UTC) (envelope-from SRS0=vdX2=YJ=mail.sermon-archive.info=doug@sermon-archive.info) Received: from [10.0.1.251] (mini [10.0.1.251]) by mail.sermon-archive.info (Postfix) with ESMTPSA id 46tpD82JCWz2fjSm; Wed, 16 Oct 2019 16:19:52 -0700 (PDT) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Subject: Re: Extension to previous posts: Problems with ld, libc, and "struct stat" From: Doug Hardie In-Reply-To: Date: Wed, 16 Oct 2019 16:19:52 -0700 Cc: Doug Hardie , FreeBSD Questions Content-Transfer-Encoding: quoted-printable Message-Id: References: To: MJ X-Mailer: Apple Mail (2.3445.104.11) X-Virus-Scanned: clamav-milter 0.101.2 at mail X-Virus-Status: Clean X-Rspamd-Queue-Id: 46tpDB2T4kz4PhM X-Spamd-Bar: - Authentication-Results: mx1.freebsd.org; dkim=none; spf=pass (mx1.freebsd.org: domain of SRS0=vdX2=YJ=mail.sermon-archive.info=doug@sermon-archive.info designates 71.177.216.148 as permitted sender) smtp.mailfrom=SRS0=vdX2=YJ=mail.sermon-archive.info=doug@sermon-archive.info X-Spamd-Result: default: False [-1.35 / 15.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; NEURAL_HAM_MEDIUM(-0.83)[-0.825,0]; FROM_HAS_DN(0.00)[]; RCPT_COUNT_THREE(0.00)[3]; R_SPF_ALLOW(-0.20)[+ip4:71.177.216.148]; MV_CASE(0.50)[]; MIME_GOOD(-0.10)[text/plain]; IP_SCORE(-0.16)[asn: 5650(-0.72), country: US(-0.05)]; NEURAL_HAM_LONG(-0.97)[-0.975,0]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; RCVD_IN_DNSWL_NONE(0.00)[148.216.177.71.list.dnswl.org : 127.0.10.0]; FORGED_SENDER(0.30)[bc979@lafn.org,SRS0=vdX2=YJ=mail.sermon-archive.info=doug@sermon-archive.info]; FREEMAIL_TO(0.00)[gmail.com]; RCVD_NO_TLS_LAST(0.10)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:5650, ipnet:71.177.216.0/23, country:US]; FROM_NEQ_ENVFROM(0.00)[bc979@lafn.org,SRS0=vdX2=YJ=mail.sermon-archive.info=doug@sermon-archive.info]; RCVD_COUNT_TWO(0.00)[2] X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Oct 2019 23:19:55 -0000 > On 16 October 2019, at 16:09, MJ wrote: >=20 >=20 > On 17/10/2019 8:02 am, Doug Hardie wrote: >> Here is an issue that has plagued me for some time: >>=20 >> testlib.c: >> #include >> #include >> #include >> #include >>=20 >> char id[4]; >> int sock; >>=20 >> void testfunc() { >> struct stat sb; >> stat("testlib.c", &sb); >> strcpy (id, "aa"); >> sock =3D 5; >> printf("Size of testlib.c is %i bytes.\n", (int)sb.st_size); >> } >>=20 >>=20 >> testprog.c: >> #include >>=20 >> extern char id[4]; >> extern int sock; >>=20 >> void testfunc(void); >> int main(int argc, char **argv) { >> testfunc(); >> printf ("id =3D %s\n", id); >> printf ("sock =3D %d\n", sock); >> return 0; >> } >>=20 >>=20 >> Makefile: >> all: clean testprog run >>=20 >> testprog: >> cc -Wall -g -c -fPIC -o testlib.o testlib.c >> cc -shared -Wl,-export-dynamic -o testlib.so testlib.o >> cc -Wall -g -o testprog ./testlib.so testprog.c >>=20 >> clean: >> rm -f testlib.o testlib.so testprog >>=20 >> run: >> ./testprog >>=20 >>=20 >> Using make: >> rm -f testlib.o testlib.so testprog >> cc -Wall -g -c -fPIC -o testlib.o testlib.c >> cc -shared -Wl,-export-dynamic -o testlib.so testlib.o >> cc -Wall -g -o testprog ./testlib.so testprog.c >> ./testprog >> Size of testlib.c is 268 bytes. >> id =3D aa >> sock =3D 5 >>=20 >>=20 >> Running lldb: >> master# lldb testprog >> (lldb) target create "testprog" >> Current executable set to 'testprog' (x86_64). >> (lldb) b main >> Breakpoint 1: where =3D testprog`main + 22 at testprog.c:8, address =3D= 0x0000000000201366 >> (lldb) r >> Process 34787 launching >> Process 34787 launched: '/home/doug/zzz/testprog' (x86_64) >> Process 34787 stopped >> * thread #1, name =3D 'testprog', stop reason =3D breakpoint 1.1 >> frame #0: 0x0000000000201366 testprog`main(argc=3D1, = argv=3D0x00007fffffffeb38) at testprog.c:8 >> 5 =09 >> 6 void testfunc(void); >> 7 int main(int argc, char **argv) { >> -> 8 testfunc(); >> 9 printf ("id =3D %s\n", id); >> 10 printf ("sock =3D %d\n", sock); >> 11 return 0; >> (lldb) n >> Size of testlib.c is 268 bytes. >> Process 34787 stopped >> * thread #1, name =3D 'testprog', stop reason =3D step over >> frame #0: 0x000000000020137f testprog`main(argc=3D1, = argv=3D0x00007fffffffeb38) at testprog.c:9 >> 6 void testfunc(void); >> 7 int main(int argc, char **argv) { >> 8 testfunc(); >> -> 9 printf ("id =3D %s\n", id); >> 10 printf ("sock =3D %d\n", sock); >> 11 return 0; >> 12 } >> (lldb) p id >> error: use of undeclared identifier 'id' >> (lldb) p sock >> error: Couldn't materialize: couldn't get the value of variable sock: = testlib.so[0x4004] can't be resolved, testlib.so is not currently loaded >> error: errored out in DoExecute, couldn't = PrepareToExecuteJITExpression >> (lldb) c >> id =3D aa >> sock =3D 5 >> Process 34787 resuming >>=20 >>=20 >> You notice that lldb cannot display values for id or sock. It even = gives quite different messages about them. However the program can = access the values and it prints them out properly. Why can't lldb see = them? How can that be corrected? >>=20 >> What is even more interesting is that in the real application there = are quite a few of these global variables and lldb can display some of = them, just not all. Possibly it has to do with the specific names as = DATE generally works. sock and id never seem to work. >>=20 >> -- Doug >=20 > Well it's obviously wrong. It's a bug in lldb. Unless you have to = specifically load the shared library in? (process load testlib?) >=20 > I tested this with gdb, it works as expected. That's probably why I = still use gdb... >=20 I tried gdb on 12.0 and got the following: master# /usr/libexec/gdb testprog GNU gdb 6.1.1 [FreeBSD] Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you = are welcome to change it and/or distribute copies of it under certain = conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for = details. This GDB was configured as "amd64-marcel-freebsd"... (gdb) b main Breakpoint 1 at 0x201366: file testprog.c, line 8. (gdb) r Starting program: /usr/home/doug/zzz/testprog=20 Breakpoint 1, main (argc=3D1, argv=3D0x7fffffffeb30) at testprog.c:8 8 testfunc(); Current language: auto; currently minimal (gdb) n Size of testlib.c is 268 bytes. 9 printf ("id =3D %s\n", id); (gdb) p id $1 =3D 0x80024b000 "" (gdb) p sock $2 =3D 0 (gdb) n id =3D aa 10 printf ("sock =3D %d\n", sock); (gdb)=20 sock =3D 5 11 return 0; (gdb) ^DThe program is running. Exit anyway? (y or n) y It doesn't throw an error, but it shows incorrect values. -- Doug