TweetFollow Us on Twitter

Universal Headers Gotcha
Volume Number:11
Issue Number:5
Column Tag:Compiler Settings

The Devil’s In The Details

Don’t get surprised by the Universal Headers

By Bill Karsh, billKarsh@aol.com

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

There is a particularly insidious problem in Apple’s Universal Headers. Whether you are affected at all, and how devastating it is, depends upon how you use their headers in your projects. Fortunately, the problem only affects 68K code generation. Here are the details, and what you can do as a work-around until new headers become available.

Which Header Versions?

The problem appears in the headers I got with Think C/C++ version 7, although these headers themselves do not seem to have a version number. The problem persists through the latest headers I got with MetroWerks CodeWarrior 5. These are version 2.0a3. Undoubtedly, you are using an affected version (I think they all are).

Structure Alignment Problem

The problem is a structure alignment conflict. Most compilers today let you apply some options regarding how structures are defined, throughout the whole of a project, or while certain pragmas are in effect. For example, you find a pop-up menu in CodeWarrior’s Processor Preferences panel, that let’s you select options called “68K,” “68K 4-byte,” or “PowerPC.” You can also use pragma statements like these:

#pragma options align=mac68k
#pragma options align=mac68k4byte
#pragma options align=native
#pragma options align=power
#pragma options align=reset

These can be used to override a globally set option. I believe that the last option stays in effect until either the next alignment statement, or the end-of-file is encountered.

In Symantec C++, the Compiler Settings page has a radio button group called “Struct Field Alignment,” that sets alignment options for a project.

Generally, the chosen alignment determines how much padding (extra space) is inserted into structures between fields, and how much padding is appended to the end of structures. Deciding which option you would want is a matter of trading-off between compactness of the data (less space) and higher performance (fields aligned on natural addresses for the field’s data-type). We won’t go into those decisions here. What is immediately essential is understanding two things.

First, these options are available to you (settable in an options page or by pragma statements) independently of whether you are generating PowerPC (ppc) code or 68K code.

Second, structures defined by the Mac OS, that is, defined in Apple’s headers, must have no extra padding in them. When the compiler comes across the definition of any Mac OS structure, like GrafPort, BitMap, or whatever, the current alignment option must be mac68k. If the current setting were anything else, your code, and the system software, would disagree on the offsets to various fields in a GrafPort, for example. That’s a disaster.

Inside Mac Headers

If you look inside virtually any Apple header, you will see one of the following examples near the top of the file:

#if defined(powerc) || defined (__powerc)
#pragma options align=mac68k
#endif

or

#if GENERATINGPOWERPC
#pragma options align=mac68k
#endif

Near the bottom you will see one of:

#if defined(powerc) || defined (__powerc)
#pragma options align=reset
#endif

or

#if GENERATINGPOWERPC
#pragma options align=reset
#endif

The intent here is to force the alignment type to mac68k while any Mac OS structures are defined. Then, align=reset puts the alignment back to whatever was in effect before. Can you see the problem? The pragma statements are made conditional upon what type of code is being generated, ppc or 68K. If you are generating ppc code only, there is no problem. If you are generating 68K code, the pragmas are not executed. You’ve got a bad problem in 68K code if, when the headers are compiled, the current alignment option is not mac68k. The pragma statements in the Apple headers were not supposed to be conditional upon anything. I’m guessing here, but it looks like a clear case of macro-mania-a-go-go.

Why Didn’t I See That?

I know, right now you are saying “how can any of my code work at all if this is true? Why didn’t I catch this immediately!?” There are several sneaky ways this problem might have escaped your notice thus far. For one thing, 68K compilers typically ship with mac68k as the default alignment option. If you never changed that, you would have been spared. Another possibility involves precompiled headers.

Your environment was shipped with precompiled headers. That is, many, but not all, of the Apple headers were precompiled at the factory into a giant header called MacHeaders68K (CW) or MacHeaders (Think), or something similar. Such a file is usually included in a global preferences dialog. That would be the Language panel in CW, or the Prefix page in Think’s dialog. There may be separate precompiled headers for C and C++. Again, chances are that you never removed it. Back at the factory, they compiled these precompiled files using the mac68k setting. Therefore, all the structures defined in there are fine. However, not all of the Apple headers are typically included in these things, only the most commonly used. This keeps symbol table sizes down, and speeds compile times.

Any time you find a need to explicitly include an Apple header in your sources, and it’s not among those precompiled at the factory, you are letting yourself in for it. You have to do something to make sure that when the compiler reads that included header, the alignment is mac68k. You have to take these steps yourself because the provision to do this automatically in the headers themselves is incorrectly coded.

What Do I Do?

If you understand what’s happening, you can choose whatever method you like to adjust for this; whatever works and is convenient. Let’s suppose you need Timer.h, and it’s not currently precompiled. Here are some possibilities:

Re-precompile MacHeaders68K, or whichever variant your project needs. Uncomment Timer.h in the source file that generates the precompiled header. Make sure the project’s global option is “68K” (CW) or “Align to 1 byte Boundary” (Think). Precompile a new MacHeaders, and include it in your working project’s preferences dialog.

Include Timer.h in a source file like this:

#pragma options align=mac68k
#include <Timer.h>
#pragma options align=reset

Repair the Apple header directly. Change this:

#if GENERATINGPOWERPC
#pragma options align=mac68k
#endif

to this:

#pragma options align=mac68k

Make the alignment options unconditional, as they were supposed to be. Do this for the reset lines too!

I know this will save you days of debugging and thousands of dollars of development costs. Could you send me just one dollar as a thank you? Worth a try.

 
AAPL
$493.50
Apple Inc.
+16.82
MSFT
$30.49
Microsoft Corpora
-0.18
GOOG
$610.18
Google Inc.
+0.33
MacTech Search:
Community Search:

Unstoppable Gorg Review
Unstoppable Gorg Review By Kevin Stout on February 9th, 2012 Our Rating: :: UNFORGETTABLEiPad Only App - Designed for the iPad Unstoppable Gorg is an unforgettable tower defense for the iPad with a 50s sci-fi theme and some... | Read more »
Pirates of Black Cove: Sink ‘Em All Will...
Nitro Games have announced an iOS spinoff of their pirate-themed PC game Pirates of Black Cove, Sink ‘Em All – and they have an entertaining trailer to go along with it. This will take the ship combat gameplay of the PC version and make it the... | Read more »
Boy Loves Girl Review
Boy Loves Girl Review By Jennifer Allen on February 9th, 2012 Our Rating: :: TOUCHINGUniversal App - Designed for iPhone and iPad A charming and memorable game about a boy desperate to impress a girl.   | Read more »
Interview with Grubby Hands’s Company Di...
With Valentine’s Day just around the corner, we’ve been focusing on the romantic aspects of the App store. Alongside reviewing Boy Loves Girl, the tale of a boy keen to woo the lady in his life, we had the opportunity to interview Dr Danny Pearce,... | Read more »
Sudoku Seasons Review
Sudoku Seasons Review By Jennifer Allen on February 9th, 2012 Our Rating: :: PUZZLINGiPad Only App - Designed for the iPad Sudoku with a Valentine’s Day theme, it does exactly what the name suggests.   | Read more »
Breakout: Boost Turns Romantic With The...
Love is in the air and so is block-busting retro fun thanks to Breakout: Boost‘s Valentine’s Day level pack that’s just been released. | Read more »
My Army Review
My Army Review By Jason Wadsworth on February 9th, 2012 Our Rating: :: MARCHING FORWARDiPhone App - Designed for the iPhone, compatible with the iPad Avoid bombs, barbed wire, enemies, mines, and so many other dangers in this... | Read more »

Price Scanner via MacPrices.net

MacBook Pros on sale today with free 8GB RAM upgra...
MacConnection has MacBook Pros available today including a free 8GB RAM upgrade with high-end 15″ and 17″ models and heavily discounted 8GB RAM upgrades with the base 15″ model and both 13″ MacBook... Read more
Open-box special: 11″ 128GB MacBook Air for $213 o...
MacMall has open-box return 11″ 128GB MacBook Airs available for $986.89 including free FedEx overnight shipping. That’s $213 off the price of unopened boxes. Apple’s one-year warranty and all... Read more
iMacs on sale bundled with free upgrade to 8GB RAM
MacConnection has 2011 iMacs in stock today with a free upgrade to 8GB of RAM. Shipping is also free. Their prices represent a $200+ savings over custom 8GB iMacs at The Apple Store: - 21″ 2.5GHz... Read more
15″ MacBook Pro sale prices, $101 off 15″ 2.2GHz m...
 B&H Photo has the 15″ 2.2GHz MacBook Pro on sale today for $1698 including free shipping plus NY sales tax only. Their price is $101 off MSRP. Adorama has the 15″ 2.2GHz MacBook Pro on sale for... Read more
Apple refurbished iMacs available starting at $999
The Apple Store has Apple Certified Refurbished iMacs available for up to $340 off the price of new models. An Apple one-year warranty is included with each model, and shipping is free: - 27″ 3.1GHz... Read more
MacBooks up to $200 off at Apple Store for Educati...
Purchase a new MacBook Pro or MacBook Air at The Apple Store for Education and take up to $200 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount.... Read more
13″ 2.4GHz White MacBook (refurbished) available f...
The Apple Store has restocked Apple Certified Refurbished 13″ 2.4GHz White MacBooks for $849 including free shipping. Their price is $150 off original MSRP for new models and includes Apple’s one-... Read more
Mac mini Server on sale for $942, $57 off MSRP
B&H Photo has Mac mini Servers on sale for $942.95 including free shipping plus NY sales tax only. Their price is $57 off MSRP, and it’s the lowest price we’ve seen for this model from any Apple... Read more

Jobs Board

Apple/Mac Technician at Ettain Group (Ir...
ettain group has an opening for a Mac Technician with one of our premier clients in Dallas, TX. OVERVIEW: Our client is ... accessories. * 3 years troubleshooting experience with Mac OS platforms... Read more
Staff Development Manager, Mac at Intuit...
with Apple as he/she leads efforts on current and future Mac engineering initiatives. This is a highly technical ... for the Intuit's Personal Finance (Mint, Quicken) Mac desktop application, as the... Read more
Software Engineer (Mac & Mobile) at...
team. It is expected that you have strong knowledge of Mac OS. Proven track record of building successful applications on Apple platforms is definitely something we are looking for. And yes,... Read more
Group Product Management Leader - Apple...
motivated product managers working together to deliver the Apple QuickBooks products, including Mobile solutions for ... with cross-functional teams to drive end-to-end delivery of Mac QuickBooks... Read more
Apple / Macintosh Engineer at Allegis Gr...
Top Skills / Technologies: - Strong knowledge of Apple MAC OS X operating systems - Strong knowledge of Apple iOS ... 7, and Apple Macintosh OS X preferred - Experience with Mac OS X Server and Open... Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.