Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Oct 2019 14:02:24 -0700
From:      Doug Hardie <bc979@lafn.org>
To:        FreeBSD Questions <freebsd-questions@freebsd.org>
Subject:   Extension to previous posts: Problems with ld, libc, and "struct stat"
Message-ID:  <E92C7F26-912F-4443-A37B-E7AF9E025CD8@mail.sermon-archive.info>

next in thread | raw e-mail | index | archive | help
Here is an issue that has plagued me for some time:

testlib.c:
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>

char id[4];
int sock;

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);
}


testprog.c:
#include <stdio.h>

extern char id[4];
extern int sock;

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


Makefile:
all:    clean testprog run

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

clean:
        rm -f testlib.o testlib.so testprog

run:
        ./testprog


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


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


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?

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.

-- Doug




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E92C7F26-912F-4443-A37B-E7AF9E025CD8>