Chapter 3 73
Linker Tasks
Using Linker commands
obj_files The name of the object file or files that will be linked
together to create dest_file.
dest_file The name of the resulting object module that will by
dynamically linked and loaded by base_prog.
As described in Step 1 in “Overview of Dynamic Linking” at the start of
this section, you can either guess at how much space will be required to
load a module, or you can try to be more accurate. The advantage of the
former approach is that it is much easier and probably adequate in most
cases; the advantage of the latter is that it results in less memory
fragmentation and could be a better approach if you have multiple
modules to load throughout the course of program execution.
The alloc_load_space function allocates only the required amount of
space. To determine how much memory is required,alloc_load_space
performs these steps:
1. Pre-link the specified obj_files to create base_prog.
2. Get text, data, and bss segment location and size information to
determine how much space to allocate.
3. Return a pointer to the space. (The address of the space is adjusted to
begin on a memory page boundary — that is, a 4096-byte boundary.)
“C Source for alloc_load_space Function” shows the source for this
function.
C Source for alloc_load_space Function
void * alloc_load_space(const char * base_prog,
const char * obj_files,
const char * dest_file)
{
char cmd_buf[256]; /* linker command line */
int ret_val; /* value returned by various lib calls */
size_t space; /* size of space to allocate for module */
size_t addr; /* address of allocated space */
size_t bss_size; /* size of bss (uninitialized data) */
FILE * destfp; /* file pointer for dest_file */
struct som_exec_auxhdr aux_hdr; /* file header */
unsigned int tdb_size; /* size of text, data, and bss combined */
/* ---------------------------------------------------------------
* STEP 1: Pre-link the destination module so we can get its size:
*/
sprintf(cmd_buf, “/bin/ld -a archive -R80000 -A %s -N %s -o %s -lc”,
base_prog, obj_files, dest_file);
if (ret_val = system(cmd_buf)) {