LAB 14 QUESTIONS SOLUTION

$30.00 $24.00

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 ,—-…

5/5 – (2 votes)

You’ll get a: zip file solution

 

Description

5/5 – (2 votes)

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.

LAB 14 QUESTIONS SOLUTION
$30.00 $24.00