2003/09/07 05:33:50
authormegacz <megacz@xwt.org>
Fri, 30 Jan 2004 07:05:14 +0000 (07:05 +0000)
committermegacz <megacz@xwt.org>
Fri, 30 Jan 2004 07:05:14 +0000 (07:05 +0000)
darcs-hash:20040130070514-2ba56-2634a3d0c2e4ab8798e44d6bc933e2ae8f8fb0ac.gz

upstream/darwin-linker/patches/cctools.patch

index 4826ffe..03fd00c 100644 (file)
@@ -937,3 +937,167 @@ diff -rub ./misc/Makefile ./misc/Makefile
  
  shlib_clean:
        -rm -f \
+--- ld/fake-mach.c     Sat Sep  6 21:32:56 2003
++++ ld/fake-mach.c     Tue Aug 26 11:40:24 2003
+@@ -0,0 +1,160 @@
++/** fake-mach.c - A half baked implementation of mach kernel functions using the POSIX UNIX API.
++*
++* This was used to port Apple's Darwin linker (ld) to Linux. This allows Mac OS X applications to
++* be cross complied on Linux. */
++
++#include <stdlib.h>
++#include <assert.h>
++#include <sys/types.h>
++#include <sys/uio.h>
++#include <unistd.h>
++
++#include <errno.h>
++
++#include <sys/mman.h>
++
++// Mach include files for typedefs, return values, etc
++//~ #include <mach/mach.h>
++#include <mach/kern_return.h>
++#include <mach/vm_types.h>
++#include <mach/mach_types.h>
++#include <mach/message.h>
++#include <servers/bootstrap_defs.h>
++
++/** The port for the current task. Ignored in this implementation. */
++mach_port_t mach_task_self_ = 0;
++
++/** The bootstrap port. Ignored in this implementation. */
++mach_port_t bootstrap_port = 0;
++
++#include <mach/ppc/ndr_def.h>
++
++/** Maps the file descriptor into memory. Free the memory using  vm_deallocate. Ignores findspace and offset. */
++kern_return_t map_fd( int fd, vm_offset_t offset, vm_offset_t *va, boolean_t findspace, vm_size_t size)
++{
++      void* space = NULL;
++
++      assert( fd > 0 );
++      assert( offset == 0 );
++      //~ assert( *va == 0 );
++      assert( findspace == TRUE );
++      
++      //~ // Allocate memory
++      //~ space = malloc( size );
++      //~ assert( space != NULL );
++      
++      //~ // Read file into space
++      //~ bytes = read( fd, space, size );
++      //~ assert( bytes == size );
++      
++      space = mmap( (void*) offset, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
++      // No permission: try to make it read only
++      if ( space == (void*) -1 && errno == EACCES )
++      {
++              space = mmap( (void*) offset, size, PROT_READ, MAP_SHARED, fd, 0 );
++      }
++      assert( space != NULL && space != (void*) -1 );
++      
++      // Copy back the pointer
++      *va = (vm_offset_t) space;
++      
++      // Return success
++      return KERN_SUCCESS;
++}
++
++/** Returns a string appropriate to the error argument given. */
++char* mach_error_string( int error_value )
++{
++      char errorString[] = "Some fake mach error string.";
++      
++      return errorString;
++}
++
++/** Returns the mach port for the current host. We fake it by returning zero. */
++mach_port_t mach_host_self( void )
++{
++      return 0;
++}
++
++/** Returns the mach port for the current task. We fake it by returning zero. */
++//~ mach_port_t mach_task_self( void )
++//~ {
++      //~ return 0;
++//~ }
++
++/**The function vm_allocate allocates a region of virtual memory, placing it in the specified task's address space. Anywhere must be true, as the memory will be allocated anywhere. */
++extern kern_return_t vm_allocate( mach_port_t target_task, vm_address_t *address, vm_size_t size, boolean_t anywhere )
++{
++      assert( anywhere == TRUE );
++      
++      // Anonymous memory map
++      *address = (vm_address_t) mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANON, 0, 0 );
++      //~ *address = (vm_address_t) malloc( size );
++      assert( address != (vm_address_t) NULL );
++      
++      return KERN_SUCCESS;
++}
++
++/**vm_deallocate relinquishes access to a region of a task's address space, causing further access to that memory to fail. This memory must have been allocated with vm_allocate. size is ignored. */
++kern_return_t vm_deallocate( mach_port_t target_task, vm_address_t address, vm_size_t size ) 
++{
++      int ret = 0;
++      
++      assert( address != (vm_address_t) NULL );
++      
++      // Free the memory
++      ret = munmap( (void*) address, size );
++      assert( ret == 0 );
++      
++      //~ free( (void*) address );
++      
++      return KERN_SUCCESS;
++}
++
++/** The function mach_port_allocate_name creates a new right in the specified task, with a specified name for the new right. In this implementation it does nothing. */
++kern_return_t mach_port_allocate_name (mach_port_t task, mach_port_right_t right, mach_port_t name)
++{
++      return KERN_SUCCESS;
++}
++
++/** The function mach_port_deallocate releases a user reference for a right in task's IPC name space. In this implementation it does nothing. */
++kern_return_t mach_port_deallocate (mach_port_t task, mach_port_t name)
++{
++      return KERN_SUCCESS;
++}
++
++/** host_info returns information about the host. It is not implemented in this implementation. */
++kern_return_t host_info( host_t host, host_flavor_t flavor, host_info_t host_info_out, mach_msg_type_number_t *host_info_outCnt )
++{
++      assert( 0 );
++      return KERN_FAILURE;
++}
++
++/** vm_msync unimplemented: It does nothing. */
++kern_return_t vm_msync ( vm_map_t target_task, vm_address_t address, vm_size_t size, vm_sync_t sync_flags )
++{
++      //~ assert( address != (vm_address_t) NULL );
++      //~ int ret = 0;
++      //~ ret = msync( (void*) address, size, int flags);
++      //~ assert( 0 );
++      return KERN_SUCCESS;
++}
++
++/** bootstrap_look_up unimplemented. */
++kern_return_t bootstrap_look_up( mach_port_t bootstrap_port, name_t service_name, mach_port_t *service_port )
++{
++      assert( 0 );
++      return KERN_FAILURE;
++}
++
++/** mach_msg unimplemented. Send and/or receive a message.  If the message operation
++ *            is interrupted, and the user did not request an indication
++ *            of that fact, then restart the appropriate parts of the
++ *            operation silently (trap version does not restart).
++ */
++mach_msg_return_t mach_msg( mach_msg_header_t *msg, mach_msg_option_t option, mach_msg_size_t send_size,
++      mach_msg_size_t rcv_size, mach_port_name_t rcv_name, mach_msg_timeout_t timeout, mach_port_name_t notify)
++{
++      //~ assert( 0 );
++      return KERN_SUCCESS;
++}
+\ No newline at end of file