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.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All

Fresh From the Land Down Under – The Tou...
After a two week hiatus, we are back with another episode of The TouchArcade Show. Eli is fresh off his trip to Australia, which according to him is very similar to America but more upside down. Also kangaroos all over. Other topics this week... | Read more »
TouchArcade Game of the Week: ‘Dungeon T...
I’m a little conflicted on this week’s pick. Pretty much everyone knows the legend of Dungeon Raid, the match-3 RPG hybrid that took the world by storm way back in 2011. Everyone at the time was obsessed with it, but for whatever reason the... | Read more »
SwitchArcade Round-Up: Reviews Featuring...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for July 19th, 2024. In today’s article, we finish up the week with the unusual appearance of a review. I’ve spent my time with Hot Lap Racing, and I’m ready to give my verdict. After... | Read more »
Draknek Interview: Alan Hazelden on Thin...
Ever since I played my first release from Draknek & Friends years ago, I knew I wanted to sit down with Alan Hazelden and chat about the team, puzzle games, and much more. | Read more »
The Latest ‘Marvel Snap’ OTA Update Buff...
I don’t know about all of you, my fellow Marvel Snap (Free) players, but these days when I see a balance update I find myself clenching my… teeth and bracing for the impact to my decks. They’ve been pretty spicy of late, after all. How will the... | Read more »
‘Honkai Star Rail’ Version 2.4 “Finest D...
HoYoverse just announced the Honkai Star Rail (Free) version 2.4 “Finest Duel Under the Pristine Blue" update alongside a surprising collaboration. Honkai Star Rail 2.4 follows the 2.3 “Farewell, Penacony" update. Read about that here. | Read more »
‘Vampire Survivors+’ on Apple Arcade Wil...
Earlier this month, Apple revealed that poncle’s excellent Vampire Survivors+ () would be heading to Apple Arcade as a new App Store Great. I reached out to poncle to check in on the DLC for Vampire Survivors+ because only the first two DLCs were... | Read more »
Homerun Clash 2: Legends Derby opens for...
Since launching in 2018, Homerun Clash has performed admirably for HAEGIN, racking up 12 million players all eager to prove they could be the next baseball champions. Well, the title will soon be up for grabs again, as Homerun Clash 2: Legends... | Read more »
‘Neverness to Everness’ Is a Free To Pla...
Perfect World Games and Hotta Studio (Tower of Fantasy) announced a new free to play open world RPG in the form of Neverness to Everness a few days ago (via Gematsu). Neverness to Everness has an urban setting, and the two reveal trailers for it... | Read more »
Meditative Puzzler ‘Ouros’ Coming to iOS...
Ouros is a mediative puzzle game from developer Michael Kamm that launched on PC just a couple of months back, and today it has been revealed that the title is now heading to iOS and Android devices next month. Which is good news I say because this... | Read more »

Price Scanner via MacPrices.net

Amazon is still selling 16-inch MacBook Pros...
Prime Day in July is over, but Amazon is still selling 16-inch Apple MacBook Pros for $500-$600 off MSRP. Shipping is free. These are the lowest prices available this weekend for new 16″ Apple... Read more
Walmart continues to sell clearance 13-inch M...
Walmart continues to offer clearance, but new, Apple 13″ M1 MacBook Airs (8GB RAM, 256GB SSD) online for $699, $300 off original MSRP, in Space Gray, Silver, and Gold colors. These are new MacBooks... Read more
Apple is offering steep discounts, up to $600...
Apple has standard-configuration 16″ M3 Max MacBook Pros available, Certified Refurbished, starting at $2969 and ranging up to $600 off MSRP. Each model features a new outer case, shipping is free,... Read more
Save up to $480 with these 14-inch M3 Pro/M3...
Apple has 14″ M3 Pro and M3 Max MacBook Pros in stock today and available, Certified Refurbished, starting at $1699 and ranging up to $480 off MSRP. Each model features a new outer case, shipping is... Read more
Amazon has clearance 9th-generation WiFi iPad...
Amazon has Apple’s 9th generation 10.2″ WiFi iPads on sale for $80-$100 off MSRP, starting only $249. Their prices are the lowest available for new iPads anywhere: – 10″ 64GB WiFi iPad (Space Gray or... Read more
Apple is offering a $50 discount on 2nd-gener...
Apple has Certified Refurbished White and Midnight HomePods available for $249, Certified Refurbished. That’s $50 off MSRP and the lowest price currently available for a full-size Apple HomePod today... Read more
The latest MacBook Pro sale at Amazon: 16-inc...
Amazon is offering instant discounts on 16″ M3 Pro and 16″ M3 Max MacBook Pros ranging up to $400 off MSRP as part of their early July 4th sale. Shipping is free. These are the lowest prices... Read more
14-inch M3 Pro MacBook Pros with 36GB of RAM...
B&H Photo has 14″ M3 Pro MacBook Pros with 36GB of RAM and 512GB or 1TB SSDs in stock today and on sale for $200 off Apple’s MSRP, each including free 1-2 day shipping: – 14″ M3 Pro MacBook Pro (... Read more
14-inch M3 MacBook Pros with 16GB of RAM on s...
B&H Photo has 14″ M3 MacBook Pros with 16GB of RAM and 512GB or 1TB SSDs in stock today and on sale for $150-$200 off Apple’s MSRP, each including free 1-2 day shipping: – 14″ M3 MacBook Pro (... Read more
Amazon is offering $170-$200 discounts on new...
Amazon is offering a $170-$200 discount on every configuration and color of Apple’s M3-powered 15″ MacBook Airs. Prices start at $1129 for models with 8GB of RAM and 256GB of storage: – 15″ M3... Read more

Jobs Board

*Apple* Systems Engineer - Chenega Corporati...
…LLC,** a **Chenega Professional Services** ' company, is looking for a ** Apple Systems Engineer** to support the Information Technology Operations and Maintenance Read more
Solutions Engineer - *Apple* - SHI (United...
**Job Summary** An Apple Solution Engineer's primary role is tosupport SHI customers in their efforts to select, deploy, and manage Apple operating systems and Read more
*Apple* / Mac Administrator - JAMF Pro - Ame...
Amentum is seeking an ** Apple / Mac Administrator - JAMF Pro** to provide support with the Apple Ecosystem to include hardware and software to join our team and Read more
Operations Associate - *Apple* Blossom Mall...
Operations Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Cashier - *Apple* Blossom Mall - JCPenney (...
Cashier - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Blossom Mall Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.