A ver... no sé a qué te refieres con lo de la ruta relativa... Lo importante es el concepto de "directorio de trabajo" o "directorio actual", que no tiene por qué ser igual al "directorio del programa" ni igual al "directorio de ejecución".
Ejemplo:
* Un programa Perl, programa.pl, que queremos ejecutar, está en /usr/local/bin
* Nosotros estamos en /home/usuario
Si ejecuto el programa como /usr/local/bin/programa.pl, su directorio de trabajo será desde lo estoy invocando: /home/usuario, por lo que todas las rutas relativas dentro de él serán con respecto a ese directorio.
Puedo incluso ejecutarlo con un cambio temporal de directorio: $(cd /otro/directorio; /usr/local/bin/programa.pl)
En este caso, el programa se estará ejecutando en /otro/directorio, pero al terminar esta orden seguiremos estando en nuestro directorio /home/usuario.
Por eso, cuando hacemos un programa que depende de posiciones fijas de otros ficheros, lo normal es hacer una de estas dos cosas (pero no excluyentes entre sí):
* hacer un chdir() al principio del programa, para que su directorio de trabajo sea aquel en que nos interesa que encuentre a los ficheros. Aquí sí que podemos usar rutas relativas.
* la indicación a los ficheros, por medio de rutas absolutas.