Category: Linux

A Quick introduction on Toolchain

What is a Toolchain?

Its a set of tools linked together by specific stages which can be used to run on a specific machine.
It contains tools for compiling, debugging , binary file manipulation and analysis.
There are pre-built toolchain available in internet. We can build our own using automated tool chain build tools or from scratch.

What are the types of Toolchain available?

Tool chains are run on 3 machine types
Build – The machine where the tool chain is first built.
Host – The machine where the tool chain is used to generate the target binary.
Target – The machine where the target binary is run.

Based on the above below are the Toolchain types
Native – The build, host and target are the same architecture. E.G:- The GCC compiler coming with RedHat x86 version
Cross Compiled – The build and host are same architecture, but the target is different. E.G:- Using x86 GCC creating a cross compiled GCC which generates binary to run on an ARM processor.
Cross Native – The host and target are of the same architecture. E.G;- Using x86 GCC create a cross native arm GCC, which can be used in an ARM Linux OS to generate binary which runs on ARM processor.
Canadian Build – The architecture for all the build, host and target differs. E.G:- Using X86 GCC create an ARM GCC which generates binary to run on a PPC machine. In this case build and target can be same architecture.

What are the Toolchain components?
The main components are
Binutils – as,ld,readelf etc
Compiler – gcc,g++ etc
C library – glibc, uclibc etc
Debugger – gdb
Kernel – headers

What are the stages in building a Toolchain?
1. Download sources for the components
2. Set the environment variables for the Toolchain build. e.g:- setting the build, host, target architecture and intermediate installation directories.
3. Build first the binutils
4. Build the bootstrap gcc with options –with-gnu-as –with-gnu-ld to instruct the compiler to use binutils assembler and linker than native assembler and linker.
5. Build glibc
6. Build gcc again with newly build glibc with options –with-gnu-as –with-gnu-ld to instruct the compiler to use binutils assembler and linker than native
7. Build gcc again with newly build glibc with options –with-gnu-as –with-gnu-ld to instruct the compiler to use binutils assembler and linker than native. This is to compare the binaries and make sure you are getting the same output and no compiler bug.
8. Use the Toolchain to build your application.
9. Run your application on the target machine.

What are the options for building a Toolchain?
Option 1: Build your own
Option 2: Prebuilt Toolchain. e.g:- CodeSourcery, Linoro(ARM) etc
Option 3: Automated Toolchain build systems. e.g:- Buildroot, Open ADK, crosstool-NG

Note:- The option 2 and 3 helps in quick development as the dependencies between the Toolchain components will be taken care by the maintainers of the Toolchain build systems.

A good article on modifying the MTU.

The maximum transmission unit (MTU) of a network interface is the size of the largest block of data that can be transmitted as a single unit. Anything larger than the MTU must be broken into smaller units prior to transmission. The following link has a short passage on modifying the MTU.

Change the MTU of a network interface

If you want to change the MTU in the linux kernel source code the macro can be found in

the location

linux/include/uapi/linux/if_ether.h

The macro name is ETH_DATA_LEN and if you are increasing it you need to increase the frame length also. The macro for from length is ETH_FRAME_LEN. I did experiment to modify MTU to 1508. So I modified the ETH_DATA_LEN to 1508 and frame length to 1522.

After the same through ifconfig I was able to set the mtu to 1508.

e.g:- ifconfig eth0 mtu 1508

Setting anything beyond ETH_DATA_LEN the ifconfig will return “SIOCSIFMTU: Invalid argument”. Also changing to any values beyond 1500 ensure your network devices support.

 

How to do ssh autologin

I got a requirement in my project to enable autologin for some build scripts to get some information from remote machine through autologin. My colleagues has given steps to create identiry and rsa files and copy them to the remote machine and rename as authorize files. But that steps didnt work. Browsing the internet I got a good reference to built-in script which Linux had. These are the 2 simple steps to enable autologin.

The machine from which you want to login just type the following commands.

ssh-keygen -q -t rsa -N ” -f ~/.ssh/id_rsa

ssh-copy-id -i ~/.ssh/id_rsa yogindar@yogindar.com

this will ask for password once. Enter the same.

Now try ssh  yogindar@yogindar.com

you will find it wont ask any password.

Single instance in Linux applications

Sometimes you may need to write an application in lnux for which multiple instances are not allowed. There is a simple way to achieve even though you have lot of other ways like semaphores, sockets etc to achieve the same. Here is a small snippet code to achieve the same using file locking.

#include <sys/file.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

 

int pid_file = -1; int rc = -1;

pid_file = open(“/var/run/whatever.pid”, O_CREAT | O_RDWR, 0666);

rc = flock(pid_file, LOCK_EX | LOCK_NB);

if(rc) {

if(EWOULDBLOCK == errno)     {

close(pid_file); // another instance is running

return;

}

}

else {

// this is the first instance

}

 

Page 1 of 25
1 2 3 25