# Binutils-&binutils-version;

The Binutils package contains a linker, an assembler, and other tools for handling object files.

## Installation of Binutils

Verify that the PTYs are working properly inside the build environment. Check that everything is set up correctly by performing a simple test:

    expect -c "spawn ls"

This command should give the following output:

    spawn ls

If, instead, it gives a message saying to create more ptys, then the environment is not set up for proper PTY operation. This issue needs to be resolved before running the test suites for Binutils and GCC.

The Binutils documentation recommends building Binutils outside of the source directory in a dedicated build directory:

    mkdir -v ../binutils-build
    cd ../binutils-build

Prepare Binutils for compilation:

    CC="gcc -isystem /usr/include" \
    LDFLAGS="-Wl,-rpath-link,/usr/lib:/lib" \
      ../binutils-&binutils-dir;/configure --prefix=/usr \
        --enable-shared

Compile the package:

    make configure-host

During `make configure-host` you may receive the following error message. It is safe to ignore.

    WARNING: `flex' is missing on your system. You should only
    need it if you modified a `.l' file. You may need the `Flex'
    package in order for those modifications to take effect. You
    can get `Flex' from any GNU archive site.

    make tooldir=/usr

## The meaning of the make parameter:

`tooldir=/usr`

- Normally, the tooldir (the directory where the executables will ultimately be located) is set to `$(exec_prefix)/$(target_alias)`. Because this is a custom system, this target-specific directory in `/usr` is not required.

The test suite for Binutils is considered critical. Do not skip it under any circumstance.

Test the results:

    make check

Install the package:

    make tooldir=/usr install

Install the `libiberty` header file that is needed by some packages:

    cp -v ../binutils-&binutils-dir;/include/libiberty.h /usr/include

## Contents of Binutils

Installed programs Installed libraries Installed directory
- addr2line, ar, as, c++filt, elfedit, gprof, ld, ld.bfd, nm, objcopy, objdump, ranlib, readelf, size, strings, and strip libiberty.a, libbfd.[a,so], and libopcodes.[a,so] /usr/lib/ldscripts

Short Descriptions

`addr2line`

- Translates program addresses to file names and line numbers; given an address and the name of an executable, it uses the debugging information in the executable to determine which source file and line number are associated with the address

`ar`

- Creates, modifies, and extracts from archives

`as`

- An assembler that assembles the output of `gcc` into object files

`c++filt`

- Used by the linker to de-mangle C++ and Java symbols and to keep overloaded functions from clashing

`elfedit`

- Updates the ELF header of ELF files

`gprof`

- Displays call graph profile data

`ld`

- A linker that combines a number of object and archive files into a single file, relocating their data and tying up symbol references

`ld.bfd`

- Hard link to `ld`

`nm`

- Lists the symbols occurring in a given object file

`objcopy`

- Translates one type of object file into another

`objdump`

- Displays information about the given object file, with options controlling the particular information to display; the information shown is useful to programmers who are working on the compilation tools

`ranlib`

- Generates an index of the contents of an archive and stores it in the archive; the index lists all of the symbols defined by archive members that are relocatable object files

`readelf`

- Displays information about ELF type binaries

`size`

- Lists the section sizes and the total size for the given object files

`strings`

- Outputs, for each given file, the sequences of printable characters that are of at least the specified length (defaulting to four); for object files, it prints, by default, only the strings from the initializing and loading sections while for other types of files, it scans the entire file

`strip`

- Discards symbols from object files

`libiberty`

- Contains routines used by various GNU programs, including `getopt`, `obstack`, `strerror`, `strtol`, and `strtoul`

`libbfd`

- The Binary File Descriptor library

`libopcodes`

- A library for dealing with opcodes—the readable text versions of instructions for the processor; it is used for building utilities like `objdump`.