$29
Answer the questions below according to the lab specification. Write
your answers directly in this text file and submit it to complete the
lab.
PROBLEM 1: Basic Library Linking
================================
(A)
~~~
The file `do_math.c' contains some basic usage of the C library math
functions like `pow()'. Compile this program using the command line
,----
| > gcc do_math.c
`----
and show the results below which should be problematic. Describe why
the linker complains about functions like `cos' and `pow'.
*Note*: problems will arise on Linux systems with gcc: other
OS/compiler combinations may not cause any problems.
/tmp/ccnEEJv8.o: In function `main':
do_math.c:(.text+0x2a): undefined reference to `cos'
do_math.c:(.text+0x45): undefined reference to `sin'
do_math.c:(.text+0x6c): undefined reference to `pow'
collect2: error: ld returned 1 exit status
There is a problem because the math library is not linked to the program.
(B)
~~~
In order to fix this problem, one must link the program against the
math library typically called `libm'. This can be done with the option
`-l' for "library" and `m' for the math library as shown:
,----
| > gcc do_math.c -lm
`----
Show a run of the resulting executable after a successful compile
below.
E is 2.718
cos(E) is -0.912
sin(E) is 0.411
E^2 is 7.389
program pid is 47326
press any key to continue
(C)
~~~
After successfully compiling `do_math.c', use the `ldd' command to
examine which dynamically linked libraries it requires to
run. Assuming the executable is named `a.out', invoke the command like
this
,----
| > ldd a.out
`----
Show the output for this command and note anything related to the math
library that is reported.
linux-vdso.so.1 (0x00007ffd10b67000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6dc9341000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6dc8f50000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6dc98e1000)
libm is the math library which can be seen on the second line down.
(D)
~~~
Run the program which should report its Process ID (pid) before
pausing. In a separate terminal, while the program is still running,
execute the pmap command to see the virtual address space for the
program (command `pmap <pid>'). Paste the results below and describe
any relation to the math library that is apparent.
000055b28e87d000 4K r-x-- a.out
000055b28ea7d000 4K r---- a.out
000055b28ea7e000 4K rw--- a.out
000055b28eed1000 132K rw--- [ anon ]
00007f5778434000 1948K r-x-- libc-2.27.so
00007f577861b000 2048K ----- libc-2.27.so
00007f577881b000 16K r---- libc-2.27.so
00007f577881f000 8K rw--- libc-2.27.so
00007f5778821000 16K rw--- [ anon ]
00007f5778825000 1652K r-x-- libm-2.27.so
00007f57789c2000 2044K ----- libm-2.27.so
00007f5778bc1000 4K r---- libm-2.27.so
00007f5778bc2000 4K rw--- libm-2.27.so
00007f5778bc3000 156K r-x-- ld-2.27.so
00007f5778d82000 20K rw--- [ anon ]
00007f5778dea000 4K r---- ld-2.27.so
00007f5778deb000 4K rw--- ld-2.27.so
00007f5778dec000 4K rw--- [ anon ]
00007ffcbc708000 136K rw--- [ stack ]
00007ffcbc776000 12K r---- [ anon ]
00007ffcbc779000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 8232K
As seen in the middle of the block of text, there are several libm locations specified.
One can assume these are related to the math library.
(E)
~~~
Repeat the general steps above with the C file `do_pthreads.c' which
will require linking to the PThreads library with `-lpthread'.
- Compile to show error messages
- Compile successfully with proper linking and show output
- Call `ldd' on the executable
- While the program is paused, run `pmap' to see its virtual address
space
Show the output of these commands below.
part 1:
cxXL5Y3.o: In function `main':
do_pthreads.c:(.text+0x63): undefined reference to `pthread_create'
do_pthreads.c:(.text+0x80): undefined reference to `pthread_create'
do_pthreads.c:(.text+0x9d): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
part 2:
doit: I am thread 1
main: I am the main thread
doit: I am thread 2
program pid is 47749
press any key to continue
part 3:
linux-vdso.so.1 (0x00007ffc01dd3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f25e47f6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f25e4405000)
/lib64/ld-linux-x86-64.so.2 (0x00007f25e4c17000)
part 4:
47876: ./a.out
00005576f8324000 4K r-x-- a.out
00005576f8524000 4K r---- a.out
00005576f8525000 4K rw--- a.out
00005576f9063000 132K rw--- [ anon ]
00007fd9ea599000 4K ----- [ anon ]
00007fd9ea59a000 8192K rw--- [ anon ]
00007fd9ead9a000 4K ----- [ anon ]
00007fd9ead9b000 8192K rw--- [ anon ]
00007fd9eb59b000 1948K r-x-- libc-2.27.so
00007fd9eb782000 2048K ----- libc-2.27.so
00007fd9eb982000 16K r---- libc-2.27.so
00007fd9eb986000 8K rw--- libc-2.27.so
00007fd9eb988000 16K rw--- [ anon ]
00007fd9eb98c000 104K r-x-- libpthread-2.27.so
00007fd9eb9a6000 2044K ----- libpthread-2.27.so
00007fd9ebba5000 4K r---- libpthread-2.27.so
00007fd9ebba6000 4K rw--- libpthread-2.27.so
00007fd9ebba7000 16K rw--- [ anon ]
00007fd9ebbab000 156K r-x-- ld-2.27.so
00007fd9ebd6a000 20K rw--- [ anon ]
00007fd9ebdd2000 4K r---- ld-2.27.so
00007fd9ebdd3000 4K rw--- ld-2.27.so
00007fd9ebdd4000 4K rw--- [ anon ]
00007fffb341b000 136K rw--- [ stack ]
00007fffb35ab000 12K r---- [ anon ]
00007fffb35ae000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 23092K
PROBLEM 2: Linking Static Libraries
===================================
(A)
~~~
Libraries come in two flavors. The default type is Dynamically Linked
Shared Libraries that were demonstrated above. An older but easier to
understand type are Statically Linked libraries.
The search functions from Assignment 4 like `binary_array_search()'
have been formed into a Statically Linked Library in the directory
`libsearch_static/'.
Change into this directory and perform a
,----
| > make
`----
to build the library.
Describe the commands you see issued for it and what command creates
the final library file. Note what file extension (`lib.something') the
static library has in your answer.
Cannot find libsearch_static directory. Searched A4, lab14.
(B)
~~~
Change back to the main lab directory where you will find a file
called `do_search.c' which uses search functions from the
library. Attempting to compile this program on its own leads to
several errors. The first is simple:
,----
| > gcc do_search.c
| do_search.c:7:10: fatal error: ds_search.h: No such file or directory
| #include "ds_search.h"
| ^~~~~~~~~~~~~
| compilation terminated.
`----
Unable to find a file to include, the compiler terminates.
Fix this by notifying the compiler where that the `ds_search.h' file
is in the library directory:
,----
| > gcc do_search.c -I ds_search_static
| ...
`----
The `-I' option allows additional directories to be searched for
`#include' directive files. However, this is not the only problem.
Show the linker errors that result from the compiling this way and
describe why they appear.
/tmp/ccL1L0O6.o: In function `main':
do_search.c:(.text+0x2b): undefined reference to `make_sequential_list'
do_search.c:(.text+0x69): undefined reference to `linkedlist_search'
do_search.c:(.text+0x9d): undefined reference to `linkedlist_search'
do_search.c:(.text+0x132): undefined reference to `list_free'
collect2: error: ld returned 1 exit status
This error occurs because the library is not linked.
(C)
~~~
The compiler can be notified of additional places to look for library
code beyond standard system locations with the `-L' option. In this
case, the library `ds_search_static' contains the library. Finally,
one must specify an additional library to link against,
`libds_search.a' in this case though invocation drops the `lib' and
`.a' parts. Run the following command:
,----
| > gcc do_search.c -I ds_search_static -L ds_search_static -lds_search
| # ^^ includes dir ^^^ ^^ libray dir ^^^^^ ^^lib name^
`----
and then run the resulting executable to show its output.
Does not compile. Shows following output
hobbs131@csel-vole-42:/home/hobbs131/CSCI2021/lab14 $ gcc do_search.c -I ds_search_static -L ds_search_static -lds_search
/usr/bin/ld: ds_search_static/libds_search.a(tree.o): unable to initialize decompress status for section .debug_info
/usr/bin/ld: ds_search_static/libds_search.a(tree.o): unable to initialize decompress status for section .debug_info
/usr/bin/ld: ds_search_static/libds_search.a(list.o): unable to initialize decompress status for section .debug_info
/usr/bin/ld: ds_search_static/libds_search.a(list.o): unable to initialize decompress status for section .debug_info
ds_search_static/libds_search.a: error adding symbols: File format not recognized
collect2: error: ld returned 1 exit status
(D)
~~~
Run the `nm' command to show the symbol names present in the resulting
executable. Verify that the text definitions for library functions
required by `do_search.c' are present and well-defined. Show your
output for `nm'
Identify some library functions that are present in the executable
that are not explicitly mentioned but are required for some library
functions that are needed (thing random number generation).
Are ALL functions from libds_search.a copied in or only those that are
needed?
Can not show output as there is no executable to run nm against. See problem C.
Problem 3: Creating Dynamically Linked Shared Libraries
=======================================================
(A)
~~~
Dynamically Linked Shared Libraries differ from static counterparts in
that no definitions are copied into an executable. Instead, when
creating programs using such libraries, definitions for the functions
in the dynamically linked libraries are left undefined and marked as
"link at runtime." On loading the program, the location of library
code is mapped into the virtual address space of the program. Since
multiple programs can map the same physical address into their virtual
address space, only one copy of functions such as `printf()' need to
be in memory for the whole system.
The provided code directory `ds_search_dynamic/' contains a `Makefile'
which will build a shared object (.so) version of a data structure
search library as follows.
,----
| > cd ds_search_dynamic/
|
| > make
| gcc -g -Wall -fpic -c tree.c
| gcc -g -Wall -fpic -c array.c
| gcc -g -Wall -fpic -c list.c
| gcc -g -Wall -fpic -c util.c
| gcc -shared -o libds_search.so tree.o array.o list.o util.o
|
| > file libds_search.so
| libds_search.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked
|
| > cd ..
`----
Compile and link the provided `do_search.c' program against this
library as follows.
,----
| > gcc do_search.c -lds_search -I ds_search_dynamic -L ds_search_dynamic
`----
Run the `ldd' utility to see what dynamic library dependencies the
resulting `a.out' program has and attempt to run it as shown.
,----
| > ldd a.out
| ...
|
| > ./a.out
| ...
`----
Show the output for these commands.
bbs131@csel-vole-42:/home/hobbs131/CSCI2021/lab14 $ ldd a.out
linux-vdso.so.1 (0x00007ffe0cbe7000)
libds_search.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7d89283000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7d89876000)
hobbs131@csel-vole-42:/home/hobbs131/CSCI2021/lab14 $ ./a.out
./a.out: error while loading shared libraries: libds_search.so: cannot open shared object file: No such file or directory
(B)
~~~
Describe any problems that you encounter with running the program and
how to resolve them using environment variables that control where the
dynamic linker searches for library dependencies.
cannot open shared object file. You can resolve this by linking the two programs through command line args.