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 {