--- as/driver.c.org 2008-09-06 03:01:08.000000000 +0900 +++ as/driver.c 2008-09-07 23:47:28.000000000 +0900 @@ -67,9 +67,22 @@ _NSGetExecutablePath(p, &bufsize); } #else +#if __FreeBSD__ + do { + int bsd_rc; + char bsd_buf[PATH_MAX]; + memset(bsd_buf, 0, sizeof(bsd_buf)); + memset(resolved_name, 0, sizeof(resolved_name)); + bsd_rc = readlink("/proc/curproc/file", bsd_buf, sizeof(bsd_buf)); + if (bsd_rc != -1) { + prefix = realpath(bsd_buf, resolved_name); + } + } while (0); +#else strcpy(p, "/proc/self/exe"); -#endif prefix = realpath(p, resolved_name); +#endif /* __FreeBSD__ */ +#endif p = rindex(prefix, '/'); if(p != NULL) p[1] = '\0'; --- include/i386/_types.h.org 2008-09-06 03:00:46.000000000 +0900 +++ include/i386/_types.h 2008-09-07 22:21:38.000000000 +0900 @@ -68,11 +68,13 @@ * stream conversions. The content must not be referenced by user programs. */ #ifndef _POSIX_C_SOURCE +#ifndef __FreeBSD__ typedef union { char __mbstate8[128]; long long _mbstateL; /* for alignment */ } __mbstate_t; typedef __mbstate_t __darwin_mbstate_t; /* mbstate_t */ +#endif /* __FreeBSD__ */ #else typedef union { char __mbstate8[128]; --- ld/pass1.c.org 2008-09-06 03:01:04.000000000 +0900 +++ ld/pass1.c 2008-09-07 22:21:13.000000000 +0900 @@ -517,10 +517,12 @@ pass1_object(file_name, file_addr, file_size, base_name, FALSE, FALSE, bundle_loader, force_weak); } +#ifndef __FreeBSD__ #if defined(VM_SYNC_DEACTIVATE) && !defined(_POSIX_C_SOURCE) && !defined(__CYGWIN__) vm_msync(mach_task_self(), (vm_address_t)file_addr, (vm_size_t)file_size, VM_SYNC_DEACTIVATE); #endif /* VM_SYNC_DEACTIVATE */ +#endif /* __FreeBSD__ */ } #ifndef RLD --- ld/pass2.c.org 2008-09-06 03:01:04.000000000 +0900 +++ ld/pass2.c 2008-09-07 22:21:16.000000000 +0900 @@ -270,10 +270,12 @@ } } output_local_symbols(); +#ifndef __FreeBSD__ #if defined(VM_SYNC_DEACTIVATE) && !defined(_POSIX_C_SOURCE) && !defined(__CYGWIN__) vm_msync(mach_task_self(), (vm_address_t)cur_obj->obj_addr, (vm_size_t)cur_obj->obj_size, VM_SYNC_DEACTIVATE); #endif /* VM_SYNC_DEACTIVATE */ +#endif /* __FreeBSD__ */ } } /* --- misc/libtool.c.org 2008-09-06 03:00:58.000000000 +0900 +++ misc/libtool.c 2008-09-07 22:20:55.000000000 +0900 @@ -2292,12 +2292,14 @@ } memcpy(p, arch->members[j].object_addr, arch->members[j].object_size); +#ifndef __FreeBSD__ #if defined(VM_SYNC_DEACTIVATE) && !defined(_POSIX_C_SOURCE) && !defined(__CYGWIN__) vm_msync(mach_task_self(), (vm_address_t)arch->members[j].object_addr, (vm_size_t)arch->members[j].object_size, VM_SYNC_DEACTIVATE); #endif /* VM_SYNC_DEACTIVATE */ +#endif /* __FreeBSD__ */ p += arch->members[j].object_size; pad = round(arch->members[j].object_size, 8) - arch->members[j].object_size;