To go one step further, I think that this may be a bug/feature that is
OS dependant.

Here is the source of the dir_chdir method which is called by
dir_s_chdir (taken from the CVS tree - dir.h v 1.5.4)

static void
dir_chdir(path)
    const char *path;
{
    if (chdir(path) < 0)
	rb_sys_fail(path);
}

As you can see, it simply invokes the <unistd.h> chdir() call.

Now, the following short c program (chdir_test.c) illustrates the
behaviour of chdir():

#include <unistd.h>
#include <stdio.h>

char *tmp="/home/stehill1/tmp/test";
char cwd[256], nwd[256];
FILE* p;

int main (void) {
        p=popen("sh -c pwd","r"); /*
        fscanf(p,"%s",cwd);
        pclose(p);

        chdir(tmp);

        p=popen("sh -c pwd","r");
        fscanf(p,"%s",nwd);
        pclose(p);

        puts(cwd);
        puts(nwd);
}

and this has the following output....
1. Under HP-UX 10.4
   delaware% ./chdir_test
   /home/stehill1/tmp
  /tmp_mnt/home/stehill1/tmp/test

2. Under Linux (i386)
   % ./chdir_test
   /home/stehill1/tmp
   /home/stehill1/tmp/test

so the chdir() call is changing the directory to the absolute local
path under HP-UX, but not under linux.

As I said, I don't have a solution at the moment. Maybe, if other
people are using other architectures they could try running the short
test program I have included, and we could start by working out which
architectures it affects.

Best regards

Steve