I was looking through the link options and came across /align. Ive put together a small (very small) test program a built it without altering /align, i get 2.5k. If i use /align:16 i get 800bytes with the same program. This is obviously due to the libraries beening linked on a smaller boundry, but i get a warning about not specifying /driver or /vxd. Is altering this /align safe? I basically want to remove any redundant space between functions etc. Adrian
This is what the manual has to say on it :-
If the program runs ok then I would sat it's fine to use. what were the exact warnings? umbongo This message was edited by umbongo, on 6/6/2001 9:47:22 AM
Syntax /ALIGN:number This option specifies the alignment of each section within the linear address space of the program. The number argument is in bytes and must be a power of two. The default is 4K. The linker issues a warning if the alignment produces an invalid image.
The warning is: LINK : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run It runs fine :-) I just wondered why the docs say nothing about /driver or /vxd having to be used. THe default seems to be 1k though? Adrian
some C compilers align also proc entry addresses:
Will the alignment of code "jump-in" addresses give a speed advantage (on Pentium) ? Some months before I aligned all my data to DWORD and got an amazing speed boost.
first proc ... ret nop nop next proc ... ret
Well, in normal Windows and Microsoft fashion, it's not mentioned in the help file about /ALIGN, but this is what that error means :
So I guess my adivce is be careful! umbongo
Linker Tools Warning LNK4108 /ALIGN specified without /DRIVER or /VXD; image may not run The /ALIGN option has been specified without also specifying either /DRIVER or /VXD. Bad alignment can prevent the operating system from loading the final image. Do not use the /ALIGN option unless building a driver or vxd.
Ok. There has been a lot of talk about ALIGN and FILEALIGN. I hope I can settle it with this post. /ALIGN sets the memory-alignment of your sections. This is default 4k. Why? Because the page size on the IA32 architecture is 4k. You need to be able to specify various protection characteristics for your sections, and the smallest granularity this can be done on is, surprise surprise, 4k. You cannot set ALIGN smaller than 4k. You can, however, set it to any multiple of 4k. Since /ALIGN requires a power-of-two, you'll only get multiples of 4k. /FILEALIGN sets the file alignment of your sections. A value of 512 or above is fine. Smaller values works on *SOME* versions of windows, 98 and NT4 I believe. 95 and win2k will not accept less than 512. 512 is the sector-size of your harddrive, btw. And if you read in CreateFile (I think) about non-cached access, you will see that file access must be done on 512byte boundaries. Probably something to do with the disk driver. I can't really see the logic about /FILEALIGN limits, but it's a fact, so do not use values less than 512. You can also use the /OPT:NoWin98 to the linker, but iirc, it only does /FILEALIGN:512 -- /FILEALIGN:4096 is the default after win98 shipped, prolly because it makes swap file access faster.