Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Nov 2019 21:48:32 -0800
From:      Doug Hardie <bc979@lafn.org>
To:        FreeBSD Questions <freebsd-questions@freebsd.org>
Subject:   Re: Extension to previous posts: Problems with ld, libc, and "struct stat"
Message-ID:  <5FBE3E7E-D9B2-486B-98F0-DBCF3E72B6E7@mail.sermon-archive.info>
In-Reply-To: <E92C7F26-912F-4443-A37B-E7AF9E025CD8@mail.sermon-archive.info>
References:  <E92C7F26-912F-4443-A37B-E7AF9E025CD8@mail.sermon-archive.info>

next in thread | previous in thread | raw e-mail | index | archive | help
We now have 12.1 with an updated compiler and linker.  Things have =
changed.  I added a bit to testprog.c:

master# more testprog.c
#include <stdio.h>

extern char id[4];
extern int sock;
int unknown;

void testfunc(void);
int main(int argc, char **argv) {
  testfunc();
  unknown =3D 9;
  printf ("id (%x) =3D %s\n", (int)&id, id);
  printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
  printf ("unknown (%x) =3D %d\n", (int)&unknown, unknown);
  return 0;
}


running it yields:
master# ./testprog
Size of testlib.c is 268 bytes.
id (20400c) =3D aa
sock(204010)  =3D 5
unknown (204008) =3D 9

That appears to be correct.  Everything worked.  However, with lldb, =
instead of error messages I get wrong values:

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:9:3, address =3D =
0x00000000002012f6
(lldb) r
Process 6039 launching
Process 6039 launched: '/home/doug/zzz/testprog' (x86_64)
Process 6039 stopped
* thread #1, name =3D 'testprog', stop reason =3D breakpoint 1.1
    frame #0: 0x00000000002012f6 testprog`main(argc=3D1, =
argv=3D0x00007fffffffeb38) at testprog.c:9:3
   6   =09
   7   	void testfunc(void);
   8   	int main(int argc, char **argv) {
-> 9   	  testfunc();
   10  	  unknown =3D 9;
   11  	  printf ("id (%x) =3D %s\n", (int)&id, id);
   12  	  printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
(lldb) n
Size of testlib.c is 268 bytes.
Process 6039 stopped
* thread #1, name =3D 'testprog', stop reason =3D step over
    frame #0: 0x0000000000201307 testprog`main(argc=3D1, =
argv=3D0x00007fffffffeb38) at testprog.c:10:11
   7   	void testfunc(void);
   8   	int main(int argc, char **argv) {
   9   	  testfunc();
-> 10  	  unknown =3D 9;
   11  	  printf ("id (%x) =3D %s\n", (int)&id, id);
   12  	  printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
   13  	  printf ("unknown (%x) =3D %d\n", (int)&unknown, unknown);
(lldb)=20
Process 6039 stopped
* thread #1, name =3D 'testprog', stop reason =3D step over
    frame #0: 0x0000000000201312 testprog`main(argc=3D1, =
argv=3D0x00007fffffffeb38) at testprog.c:11:3
   8   	int main(int argc, char **argv) {
   9   	  testfunc();
   10  	  unknown =3D 9;
-> 11  	  printf ("id (%x) =3D %s\n", (int)&id, id);
   12  	  printf ("sock(%x)  =3D %d\n", (int)&sock, sock);
   13  	  printf ("unknown (%x) =3D %d\n", (int)&unknown, unknown);
   14  	  return 0;
(lldb) p id
(char [4]) $0 =3D ""
(lldb) p &id
(char (*)[4]) $1 =3D 0x000000080024d000
(lldb) p unknown
(int) $2 =3D 9
(lldb) p &unknown
(int *) $3 =3D 0x0000000000204008
(lldb)=20

For the variable unknown lldb displays the correct address and value.  =
For id and sock, it displays the wrong address and the value at the =
wrong address.  The correct values are in the proper addresses:

 x 0x204008
0x00204008: 09 00 00 00 61 61 00 00 05 00 00 00 00 00 00 00  =
....aa..........

-- Doug


> On 16 October 2019, at 14:02, Doug Hardie <bc979@lafn.org> wrote:
>=20
> Here is an issue that has plagued me for some time:
>=20
> testlib.c:
> #include <sys/stat.h>
> #include <stdio.h>
> #include <string.h>
> #include <strings.h>
>=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 <stdio.h>
>=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
> _______________________________________________
> freebsd-questions@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to =
"freebsd-questions-unsubscribe@freebsd.org"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5FBE3E7E-D9B2-486B-98F0-DBCF3E72B6E7>