Mercurial > hg > xemacs-beta
comparison src/unexcw.c @ 444:576fb035e263 r21-2-37
Import from CVS: tag r21-2-37
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:36:19 +0200 |
parents | abe6d1db359e |
children | 1ccc32a20af4 |
comparison
equal
deleted
inserted
replaced
443:a8296e22da4e | 444:576fb035e263 |
---|---|
49 | 49 |
50 #define ALLOC_UNIT 0xFFFF | 50 #define ALLOC_UNIT 0xFFFF |
51 #define ALLOC_MASK ~((unsigned long)(ALLOC_UNIT)) | 51 #define ALLOC_MASK ~((unsigned long)(ALLOC_UNIT)) |
52 #define ALIGN_ALLOC(addr) \ | 52 #define ALIGN_ALLOC(addr) \ |
53 ((((unsigned long)addr) + ALLOC_UNIT) & ALLOC_MASK) | 53 ((((unsigned long)addr) + ALLOC_UNIT) & ALLOC_MASK) |
54 /* Note that all sections must be aligned on a 0x1000 boundary so | |
55 this is the minimum size that our dummy bss can be. */ | |
56 #define BSS_PAD_SIZE 0x1000 | |
54 | 57 |
55 /* To prevent zero-initialized variables from being placed into the bss | 58 /* To prevent zero-initialized variables from being placed into the bss |
56 section, use non-zero values to represent an uninitialized state. */ | 59 section, use non-zero values to represent an uninitialized state. */ |
57 #define UNINIT_PTR ((void *) 0xF0A0F0A0) | 60 #define UNINIT_PTR ((void *) 0xF0A0F0A0) |
58 #define UNINIT_LONG (0xF0A0F0A0L) | 61 #define UNINIT_LONG (0xF0A0F0A0L) |
250 | 253 |
251 int i; | 254 int i; |
252 void* empty_space; | 255 void* empty_space; |
253 extern int static_heap_dumped; | 256 extern int static_heap_dumped; |
254 SCNHDR section; | 257 SCNHDR section; |
255 /* calculate new sizes f_ohdr.dsize is the total initialized data | 258 /* calculate new sizes: |
256 size on disk which is f_data.s_size + f_idata.s_size. | 259 |
257 f_ohdr.data_start is the base addres of all data and so should | 260 f_ohdr.dsize is the total initialized data size on disk which is |
258 not be changed. *.s_vaddr is the virtual address of the start | 261 f_data.s_size + f_idata.s_size. |
259 of the section normalzed from f_ohdr.ImageBase. *.s_paddr | 262 |
260 appears to be the number of bytes in the section actually used | 263 f_ohdr.data_start is the base addres of all data and so should |
261 (whereas *.s_size is aligned). | 264 not be changed. |
265 | |
266 *.s_vaddr is the virtual address of the start of the section | |
267 *normalized from f_ohdr.ImageBase. | |
268 | |
269 *.s_paddr appears to be the number of bytes in the section | |
270 *actually used (whereas *.s_size is aligned). | |
262 | 271 |
263 bsize is now 0 since subsumed into .data | 272 bsize is now 0 since subsumed into .data |
264 dsize is dsize + (f_data.s_vaddr - f_bss.s_vaddr) | 273 dsize is dsize + (f_data.s_vaddr - f_bss.s_vaddr) |
265 f_data.s_vaddr is f_bss.s_vaddr | 274 f_data.s_vaddr is f_bss.s_vaddr |
266 f_data.s_size is new dsize maybe. | 275 f_data.s_size is new dsize maybe. |
276 { | 285 { |
277 new_bss_size = f_nextdata.s_vaddr - f_bss.s_vaddr; | 286 new_bss_size = f_nextdata.s_vaddr - f_bss.s_vaddr; |
278 data_padding = (f_bss.s_vaddr - f_data.s_vaddr) - f_data.s_size; | 287 data_padding = (f_bss.s_vaddr - f_data.s_vaddr) - f_data.s_size; |
279 } | 288 } |
280 | 289 |
281 file_sz_change=new_bss_size + data_padding; | 290 file_sz_change=(new_bss_size + data_padding) - BSS_PAD_SIZE; |
282 new_data_size=f_ohdr.dsize + file_sz_change; | 291 new_data_size=f_ohdr.dsize + file_sz_change; |
283 | 292 |
284 if (!sections_reversed) | 293 if (!sections_reversed) |
285 { | 294 { |
286 f_data.s_vaddr = f_bss.s_vaddr; | 295 f_data.s_vaddr = f_bss.s_vaddr; |
295 #endif | 304 #endif |
296 f_data.s_size += file_sz_change; | 305 f_data.s_size += file_sz_change; |
297 lseek (a_new, 0, SEEK_SET); | 306 lseek (a_new, 0, SEEK_SET); |
298 /* write file header */ | 307 /* write file header */ |
299 f_hdr.f_symptr += file_sz_change; | 308 f_hdr.f_symptr += file_sz_change; |
300 f_hdr.f_nscns--; | 309 |
301 printf("writing file header\n"); | 310 printf("writing file header\n"); |
302 if (write(a_new, &f_hdr, sizeof(f_hdr)) != sizeof(f_hdr)) | 311 if (write(a_new, &f_hdr, sizeof(f_hdr)) != sizeof(f_hdr)) |
303 { | 312 { |
304 PERROR("failed to write file header"); | 313 PERROR("failed to write file header"); |
305 } | 314 } |
310 if (new_data_size < f_ohdr.dsize + f_ohdr.bsize ) | 319 if (new_data_size < f_ohdr.dsize + f_ohdr.bsize ) |
311 { | 320 { |
312 PERROR("new data size is < approx"); | 321 PERROR("new data size is < approx"); |
313 } | 322 } |
314 f_ohdr.dsize=new_data_size; | 323 f_ohdr.dsize=new_data_size; |
315 f_ohdr.bsize=0; | 324 f_ohdr.bsize=BSS_PAD_SIZE; |
316 if (write(a_new, &f_ohdr, sizeof(f_ohdr)) != sizeof(f_ohdr)) | 325 if (write(a_new, &f_ohdr, sizeof(f_ohdr)) != sizeof(f_ohdr)) |
317 { | 326 { |
318 PERROR("failed to write optional header"); | 327 PERROR("failed to write optional header"); |
319 } | 328 } |
320 /* write text as is */ | 329 /* write text as is */ |
323 if (write(a_new, &f_text, sizeof(f_text)) != sizeof(f_text)) | 332 if (write(a_new, &f_text, sizeof(f_text)) != sizeof(f_text)) |
324 { | 333 { |
325 PERROR("failed to write text header"); | 334 PERROR("failed to write text header"); |
326 } | 335 } |
327 | 336 |
337 /* Write small bss section. */ | |
338 if (!sections_reversed) | |
339 { | |
340 f_bss.s_size = BSS_PAD_SIZE; | |
341 f_bss.s_paddr = BSS_PAD_SIZE; | |
342 f_bss.s_vaddr = f_data.s_vaddr - BSS_PAD_SIZE; | |
343 if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss)) | |
344 { | |
345 PERROR("failed to write bss header"); | |
346 } | |
347 } | |
348 | |
328 /* write new data header */ | 349 /* write new data header */ |
329 printf("writing .data header\n"); | 350 printf("writing .data header\n"); |
330 | 351 |
331 if (write(a_new, &f_data, sizeof(f_data)) != sizeof(f_data)) | 352 if (write(a_new, &f_data, sizeof(f_data)) != sizeof(f_data)) |
332 { | 353 { |
333 PERROR("failed to write data header"); | 354 PERROR("failed to write data header"); |
355 } | |
356 | |
357 /* Write small bss section. */ | |
358 if (sections_reversed) | |
359 { | |
360 f_bss.s_size = BSS_PAD_SIZE; | |
361 f_bss.s_paddr = BSS_PAD_SIZE; | |
362 f_bss.s_vaddr = f_nextdata.s_vaddr - BSS_PAD_SIZE; | |
363 if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss)) | |
364 { | |
365 PERROR("failed to write bss header"); | |
366 } | |
334 } | 367 } |
335 | 368 |
336 printf("writing following data header\n"); | 369 printf("writing following data header\n"); |
337 f_nextdata.s_scnptr += file_sz_change; | 370 f_nextdata.s_scnptr += file_sz_change; |
338 if (f_nextdata.s_lnnoptr != 0) f_nextdata.s_lnnoptr += file_sz_change; | 371 if (f_nextdata.s_lnnoptr != 0) f_nextdata.s_lnnoptr += file_sz_change; |
358 { | 391 { |
359 PERROR("failed to write data header"); | 392 PERROR("failed to write data header"); |
360 } | 393 } |
361 } | 394 } |
362 | 395 |
363 /* dump bss to maintain offsets */ | |
364 memset(&f_bss, 0, sizeof(f_bss)); | |
365 if (write(a_new, &f_bss, sizeof(f_bss)) != sizeof(f_bss)) | |
366 { | |
367 PERROR("failed to write bss header"); | |
368 } | |
369 | |
370 size=lseek(a_new, 0, SEEK_CUR); | 396 size=lseek(a_new, 0, SEEK_CUR); |
371 CHECK_AOUT_POS(size); | 397 CHECK_AOUT_POS(size); |
372 | 398 |
373 /* copy eveything else until start of data */ | 399 /* copy eveything else until start of data */ |
374 size = f_data_s_scnptr - lseek (a_out, 0, SEEK_CUR); | 400 size = f_data_s_scnptr - lseek (a_out, 0, SEEK_CUR); |
379 | 405 |
380 CHECK_AOUT_POS(f_data_s_scnptr); | 406 CHECK_AOUT_POS(f_data_s_scnptr); |
381 | 407 |
382 if (!sections_reversed) | 408 if (!sections_reversed) |
383 { | 409 { |
384 /* dump bss + padding between sections */ | 410 /* dump bss + padding between sections, sans small bss pad */ |
385 printf ("dumping .bss into executable... %lx bytes\n", bss_size); | 411 printf ("dumping .bss into executable... %lx bytes\n", bss_size); |
386 if (write(a_new, bss_start, bss_size) != (int)bss_size) | 412 if (write(a_new, bss_start, bss_size) != (int)bss_size) |
387 { | 413 { |
388 PERROR("failed to write bss section"); | 414 PERROR("failed to write bss section"); |
389 } | 415 } |
390 | 416 |
391 /* pad, needs to be zero */ | 417 /* pad, needs to be zero */ |
392 bss_padding = new_bss_size - bss_size; | 418 bss_padding = (new_bss_size - bss_size) - BSS_PAD_SIZE; |
419 if (bss_padding < 0) | |
420 { | |
421 PERROR("padded .bss too small"); | |
422 } | |
393 printf ("padding .bss ... %lx bytes\n", bss_padding); | 423 printf ("padding .bss ... %lx bytes\n", bss_padding); |
394 empty_space = malloc(bss_padding); | 424 empty_space = malloc(bss_padding); |
395 memset(empty_space, 0, bss_padding); | 425 memset(empty_space, 0, bss_padding); |
396 if (write(a_new, empty_space, bss_padding) != (int)bss_padding) | 426 if (write(a_new, empty_space, bss_padding) != (int)bss_padding) |
397 { | 427 { |
418 size = f_nextdata_s_scnptr - size; | 448 size = f_nextdata_s_scnptr - size; |
419 dup_file_area(a_out, a_new, size); | 449 dup_file_area(a_out, a_new, size); |
420 } | 450 } |
421 else | 451 else |
422 { | 452 { |
423 /* need to bad to bss with data in file */ | 453 /* need to pad to bss with data in file */ |
424 printf ("padding .data ... %lx bytes\n", data_padding); | 454 printf ("padding .data ... %lx bytes\n", data_padding); |
425 size = (f_bss_s_vaddr - f_data_s_vaddr) - data_size; | 455 size = (f_bss_s_vaddr - f_data_s_vaddr) - data_size; |
426 dup_file_area(a_out, a_new, size); | 456 dup_file_area(a_out, a_new, size); |
427 | 457 |
428 /* dump bss + padding between sections */ | 458 /* dump bss + padding between sections */ |
431 { | 461 { |
432 PERROR("failed to write bss section"); | 462 PERROR("failed to write bss section"); |
433 } | 463 } |
434 | 464 |
435 /* pad, needs to be zero */ | 465 /* pad, needs to be zero */ |
436 bss_padding = new_bss_size - bss_size; | 466 bss_padding = (new_bss_size - bss_size) - BSS_PAD_SIZE; |
467 if (bss_padding < 0) | |
468 { | |
469 PERROR("padded .bss too small"); | |
470 } | |
437 printf ("padding .bss ... %lx bytes\n", bss_padding); | 471 printf ("padding .bss ... %lx bytes\n", bss_padding); |
438 empty_space = malloc(bss_padding); | 472 empty_space = malloc(bss_padding); |
439 memset(empty_space, 0, bss_padding); | 473 memset(empty_space, 0, bss_padding); |
440 if (write(a_new, empty_space, bss_padding) != (int)bss_padding) | 474 if (write(a_new, empty_space, bss_padding) != (int)bss_padding) |
441 { | 475 { |