Ticket #2013: linker-freebsd-amd64.patch
| File linker-freebsd-amd64.patch, 4.0 KB (added by mboes, 5 years ago) |
|---|
-
rts/Linker.c
old new 59 59 #include <sys/wait.h> 60 60 #endif 61 61 62 #if defined(ia64_HOST_ARCH) || defined( openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS)62 #if defined(ia64_HOST_ARCH) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) 63 63 #define USE_MMAP 64 64 #include <fcntl.h> 65 65 #include <sys/mman.h> 66 66 67 #if defined( openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS)67 #if defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) 68 68 #ifdef HAVE_UNISTD_H 69 69 #include <unistd.h> 70 70 #endif … … 1199 1199 struct stat st; 1200 1200 int r, n; 1201 1201 #ifdef USE_MMAP 1202 /* In the absence of a MAP_32BIT flag to mmap() we map objects one 1203 * after the other starting from a fixed location in memory. */ 1202 1204 int fd, pagesize; 1203 void *map_addr = NULL;1205 static void *map_addr = (void *)0x40000000L; 1204 1206 #else 1205 1207 FILE *f; 1206 1208 #endif … … 1262 1264 1263 1265 #ifdef USE_MMAP 1264 1266 #define ROUND_UP(x,size) ((x + size - 1) & ~(size - 1)) 1267 #define ROUND_DOWN(x,size) (x & ~(size - 1)) 1265 1268 1266 1269 /* On many architectures malloc'd memory isn't executable, so we need to use mmap. */ 1267 1270 … … 1278 1281 #ifdef ia64_HOST_ARCH 1279 1282 /* The PLT needs to be right before the object */ 1280 1283 n = ROUND_UP(PLTSize(), pagesize); 1281 oc->plt = mmap( NULL, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);1284 oc->plt = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 1282 1285 if (oc->plt == MAP_FAILED) 1283 1286 barf("loadObj: can't allocate PLT"); 1284 1287 … … 1297 1300 #if defined(x86_64_HOST_ARCH) && defined(MAP_32BIT) 1298 1301 #define EXTRA_MAP_FLAGS MAP_32BIT 1299 1302 #else 1300 #define EXTRA_MAP_FLAGS 01303 #define EXTRA_MAP_FLAGS MAP_FIXED 1301 1304 #endif 1302 1305 1303 1306 /* MAP_ANONYMOUS is MAP_ANON on some systems, e.g. OpenBSD */ … … 1309 1312 MAP_PRIVATE|EXTRA_MAP_FLAGS, fd, 0); 1310 1313 if (oc->image == MAP_FAILED) 1311 1314 barf("loadObj: can't map `%s'", path); 1315 map_addr += n; 1312 1316 1313 1317 close(fd); 1314 1318 … … 2596 2600 #define Elf_Sym Elf64_Sym 2597 2601 #define Elf_Rel Elf64_Rel 2598 2602 #define Elf_Rela Elf64_Rela 2603 #if !defined(freebsd_HOST_OS) 2599 2604 #define ELF_ST_TYPE ELF64_ST_TYPE 2600 2605 #define ELF_ST_BIND ELF64_ST_BIND 2601 2606 #define ELF_R_TYPE ELF64_R_TYPE 2602 2607 #define ELF_R_SYM ELF64_R_SYM 2608 #endif 2603 2609 #else 2604 2610 #define ELFCLASS ELFCLASS32 2605 2611 #define Elf_Addr Elf32_Addr … … 2772 2778 x86_64_high_symbol( char *lbl, void *addr ) 2773 2779 { 2774 2780 x86_64_bounce *bounce; 2781 int pagesize; 2782 2783 pagesize = getpagesize(); 2775 2784 2776 if ( x86_64_bounce_buffer == NULL || 2785 if ( x86_64_bounce_buffer == NULL || 2777 2786 x86_64_bb_next_off >= X86_64_BB_SIZE ) { 2778 x86_64_bounce_buffer = 2779 mmap(NULL, X86_64_BB_SIZE * sizeof(x86_64_bounce), 2780 PROT_EXEC|PROT_READ|PROT_WRITE, 2781 MAP_PRIVATE|EXTRA_MAP_FLAGS|MAP_ANONYMOUS, -1, 0); 2787 #ifdef MAP_32BIT 2788 x86_64_bounce_buffer = 2789 mmap(NULL, X86_64_BB_SIZE * sizeof(x86_64_bounce), 2790 PROT_EXEC|PROT_READ|PROT_WRITE, 2791 MAP_PRIVATE|EXTRA_MAP_FLAGS|MAP_ANONYMOUS, -1, 0); 2792 #else 2793 #define X86_64_BOUNCE_BUFFER_TOP 0x80000000L; 2794 x86_64_bounce *map_addr; 2795 2796 x86_64_bounce_buffer = x86_64_bounce_buffer ? 2797 x86_64_bounce_buffer : (x86_64_bounce *)X86_64_BOUNCE_BUFFER_TOP; 2798 map_addr = x86_64_bounce_buffer - X86_64_BB_SIZE; 2799 map_addr = ROUND_DOWN((int)map_addr, pagesize); 2800 /* In the absence of MAP_32BIT we allocate the bounce 2801 * buffers at a fixed address, one after the other, 2802 * starting from the top and growing downwards. */ 2803 x86_64_bounce_buffer = 2804 mmap(map_addr, X86_64_BB_SIZE * sizeof(x86_64_bounce), 2805 PROT_EXEC|PROT_READ|PROT_WRITE, 2806 MAP_PRIVATE|EXTRA_MAP_FLAGS|MAP_ANONYMOUS, -1, 0); 2807 #endif 2782 2808 if (x86_64_bounce_buffer == MAP_FAILED) { 2783 barf("x86_64_high_symbol: mmap failed ");2809 barf("x86_64_high_symbol: mmap failed at %p", x86_64_bounce_buffer); 2784 2810 } 2785 2811 x86_64_bb_next_off = 0; 2786 2812 }
