Jeff Duntemann's Contrapositive Diary Rotating Header Image

A libc Mystery…Solved

We have solved the mystery described in yesterday’s entry…

…mostly. I’ve found down the years that inside any big mystery are likely one or more smaller mysteries. And so it is. I would have figured this problem out a whole lot sooner if the symptoms had been consistent.

They weren’t. And those symptoms made me nuts for several days. Eventually I decided to yell for help.

I got a lot of very good help. If you haven’t read yesterday’s entry (and if you’re actually interested in assembly language programming) go read it now. I won’t repeat all the details here.

In short: I wrote a small demo program for my new book, x64 Assembly Language Step By Step. It didn’t work. Several of my readers took the code I posted in yesterday’s entry, built the executable, and…it worked.

That’s what made me nuts. I ran the damned thing on three different Linux instances, and the problem manifested on all three of them. But a couple of my friends ran the executable and had no trouble at all. It worked perfectly.

WTF?

That’s actually the small mystery inside the big mystery. The big mystery we figured out fairly quickly. Bruce, a new Contra commenter, built the executable and it failed. He changed one line in the program, and it worked. I tried his fix. It worked. Mystery solved.

But…why? Bruce cleared register RDI to null (i.e., 0) before calling the libc time function. I had cleared RAX, as part of an earlier test to try and pin down the symptoms. I intended to remove that line from the program. But it gave Bruce an idea: clear RDI instead. He did. It worked. I tried it, and…victory! Clearing RDI to 0 completely eliminated the problem, and I spent another hour trying various things to crash the executable. No luck. It was a consistent fix, in that once I cleared RDI to 0, nothing else would make the executable malfunction.

I think it started to dawn on several of us at once. Supposedly, the time function doesn’t take any parameters. Or so I supposed, based on my reading. But that was wrong. The Linux time function takes one (understated) parameter: The parameter can either be 0, or it can be an address. If it’s an address, time will put the current time_t timestamp value at that address. If it’s 0, time will return the time_t value in RAX.

In stepping through the demo program’s execution in a debugger, I noticed that after a call to the puts function, register RDI would contain a memory address. It wasn’t always the same, and it wasn’t generally useful, So un-useful, in fact, that the garbage addresses being left in RDI would cause either a hang or a segmentation fault. In the x64 calling convention, the first parameter is always passed to a function in RDI. I didn’t think of time as having any parameters at all, but clearing RDI to 0 before calling time guaranteed that time would place the time_t value safely in register RAX…instead of crashing.

So the big mystery was solved. I spent an hour and a half trying to get the program to crash. As long as RDI was 0 when time was called, it did not crash. Halleluia! The big mystery was solved.

The small mystery remained: Why did some of my readers built the executable and have it work perfectly, while the exact same program on my Linux machines went belly-up? That remains an open service ticket. I’m mildly curious, but as long as I know that RDI has to be either 0 (preferably) or the address of a suitable buffer to hold the time_t value, all will be well.

Let me wrap up by abundantly thanking everyone who took part in the bug hunt:

  • My friend and SFF collaborator Jim Strickland
  • Linux expert Bill Buhler
  • New commenter Bruce
  • Long-time reader Jason Bucata
  • X64 programming expert Jonathan O’Neal
  • Contra regular Keith

You guys were brilliant. I will cite you all on the Acknowlegements page in the book, when it comes up (with some luck) next summer.

Again, thanks. In a weird but satifying way, it was fun. Now I have to get back to work.

A libc Mystery

As most of you know by now, I’m hard at work on the x64 edition of my assembly book, to be called X64 Assembly Language Step By Step. I’m working on the chapter where I discuss calling functions in libc from assembly language. The 2009 edition of the book was pure 32-bit x86. Parameters were passed to libc functions mostly by pushing them on the stack, which required cleaning up the stack after each call, etc.

Calling conventions in x64 are radically different. The first six parameters to any function are passed in registers. (More than six and you have to start pushing them on the stack.) The first parameter goes in RDI, the second in RSI, the third in RDX, and so on. When a function returns a single value, that value is passed back in RAX. This allows a lot more to be done without fooling with the stack.

Below is a short example program that makes four calls to libc functions: Two calls to puts(), a call to time, and a call to ctime. Here’s the makefile for the program:

showtime: showtime.o
        gcc showtime.o -o showtime -no-pie
showtime.o: showtime.asm 
        nasm -f elf64 -g -F dwarf showtime.asm -l showtime.lst

I’ve used this makefile for other example programs that call libc functions, and they all work. So take a look:

section .data
        timemsg db    "The timestamp is: ",0
        timebuf db    28,0   ; not useed yet
        time1   dq    0      ; time_t stored here.

section .bss

section .text

extern  time
extern  ctime
extern  puts
global  main

main:
        push rbp            ; Prolog    
        mov rbp,rsp

        mov rdi,timemsg     ; Put address of message in rdi
        call puts           ; call libc function puts
               
        xor rax,rax         ; Zero rax
        call time           ; time returns time_t value in rax        
        mov [time1],rax     ; Save time_t value to var time1
        
        mov rdi,time1       ; Copy pointer to time_t value to rdi
        call ctime          ; Returns ptr to the date string in rax

        mov rdi,rax         ; Copy pointer to string into rdi
        call puts           ; Print ctime's output string
        
        mov rsp,rbp         ; Epilog
        pop rbp
        
        ret                 ; Return from main()

Not much to it. There are four sections, not counting the prolog and epilog: The program prints an intro message using puts, then fetches the current time in time_t format, then uses ctime to convert the time_t value to the canonical human-readable format, and finally displays the date string. All done.

So what’s the problem? When the program hits the second puts call, it hangs, and I have to hit ctrl-z to break out of it. That’s peculiar enough, given how many times I’ve successfully used puts, time, and ctime in short examples.

The program assembles and links without problems, using the makefile shown above the program itself. I’ve traced it in a debugger, and all the parameters passed into the functions and their return values are as they should be. Even in a debugger, when the code calls the second instance of puts, it hangs.

Ok. Now here’s the really weird part: If you comment out one of the two puts calls (it doesn’t matter which one) the program doesn’t hang. One of the lines of text isn’t displayed but the calls to time and ctime work normally.

I’ve googled the crap out of this problem and haven’t come up with anything useful. My guess is that there’s some stack shenanigans somewhere, but all the register values look fine in the debugger, and the pointer passed back in rax by ctime does indeed point to the canonical null-terminated text string. The prolog creates the stack frame, and the epilog destroys it. My code doesn’t push anything between the prolog and epilog. All it does is make four calls into libc. It can successfully make three calls into libc…but not four.

Do you have to clean up the stack somehow after a plain vanilla x64 call into libc? That seems unlikely. And if so, why doesn’t the problem happen when the other three calls take place?

Hello, wall. Anybody got any suggestions?

The Mastodon Hunters

Well, I didn’t expect this, though I probably should have: A huge wave of former Twitter bluechecks and their followers have descended upon the Mastodon Federation, and–sunuvugun–they’ve started throwing spears at each other.

First of all, for those who have never heard of it: Mastodon is a social network modeled superficially on Twitter. It’s distributed, in that anyone can create a server instance of Mastodon, and connect to other Mastodon instances through an underlying protocol called ActivityPub. It’s very cool in its own way, and brings other (ancient) distributed social networks to mind, like Fidonet and Usenet. Within a server instance, members can post and read tweet-ish things called “toots.” Theoretically, any Mastodon instance (there about 7,000 of them) can trade traffic with any other Mastodon instance. Content moderation, codes of conduct, and control of what other instances can share traffic are entirely under the control of the members of a given instance. There is no centralized management. Each instance governs itself.

So NPR’s Adam Davidson set up a Mastodon instance called journa.host, mostly targeted at journalists fleeing Twitter. The journa.host instance now has about 1,600 members, though that number doubtless changes hourly. I’ve cruised some of the posts, and it looks a great deal like the sort of stuff we’ve always seen on Twitter: some interesting, some blather, and some complaining about the indiscretions of others. Here’s the weird part: Almost immediately, fights broke out.

Maybe that’s not weird. Maybe that’s just how social networks operate. In this case, it had repercussions: A great many Mastodon instances, told by one malcontent or another that journa.host was transphobic, decided to block journa.host entirely. If you read Twitter, look for posts by @ajaromano, a bluecheck journalist who’s been trying to figure out why journa.host is being blocked so much. There’s a threadroll here. She’s trying to pin down what makes journa.host transphobic, and so far she got nuthin. Someone linked to a transphobic NYT article? Seriously? The NYT?

What this leaves us with is basically a Twitter-flavored forum with 1,600 members, shunned by all the other major Mastodon instances. So much for having 75,000 followers.

Now, why? I seriously doubt journa.host did anything transphobic or Aja Romero would have found it by now. I think the problem is much simpler and more mundane: Longtime Mastodon users think the wave after wave of Twitter refugees are ruining the neighborhood. The federation network can’t crash, but massive activity spikes can slow things down enough so that it might as well have crashed.

I’m not sure why it should be so, but I’ve read that Mastodon leans left. So in a way it’s the perfect solution for people who hate Elon Musk enough to bail on Twitter, leaving their blue checks and their thousands of followers behind. Alas, right now it looks a lot like Mastodon’s fediverse is the Holy Roman Empire of social networks: thousands of dukedoms, city-states, and strange little scraps of intellectual backwaters and walled fiefdoms that just don’t talk to anybody else and occasionally start throwing rocks.

What happens next? Nobody’s saying it out loud, but I’ll hazard a guess: They’ll soon be back on Twitter. How soon? A month or so. We won’t know for sure because they won’t want to admit it, but Twitter is successful because it’s big. Musk will eventually figure out how to make it pay. The real interesting question is what shape the Mastodon fediverse will be in come the new year. What’s the sound of one instance banning?

Silence. Heh.

The Great 2022 Mastodon Migration

My God, you’d think the world was ending. The screaming, yowling, weeping and rolling on the floor in the wake of Twtter’s acquisition by Elon Musk is something to see. I’m interested in Twitter because for me it fills a need: quick announcements, wisecracks, indie book promo, Odd Lots-style links to things I find interesting or useful….so what’s not to like?

One thing, and one thing only: disagreement.

But that’s the viewpoint of the bluechecks, not me or most of my friends. The bluechecks are fleeing Twitter. Where to? Mastodon, mostly. Poor Mastodon. Gazillions of new users are arriving, with so little computer smarts that they can’t figure out how to use the platform. Mastodon has a lot of promise. This is their chance to make the bigtime, instead of lurking in the shadows of all the monumentally larger social networks. I’m very curious to see what they make of it. I wonder if they understand the demands that will be made of them: Forbid disagreement with…anybody I don’t like.

There was a time when disagreement was a learning opportunity. Or most of it, anyway, at least disagreement among reasonably intelligent people. But that was way back in the ’70s. As we slid into the ’80s, disagreement became insult. I avoided disagreeing with people of a certain psychology, knowing that they’d just get bright red and scream at me before I ever had a chance to make a case for my own positions.

The ’80s were the era when, little by little, I stopped going to SF conventions. Why hang out with people who’ll jump down your throat at the slightest hint of disagreement? I missed the social element of conventions, but by 1985 or 86 cons had gotten so toxic I just stopped going.

(These days I go to one con a year: Libertycon, where I know I won’t get screamed at for having ideas at odds with the bluecheck zeitgeist.)

Now, in the Groaning Twenties, disagreement is first-degree murder. Or genocide. Or maybe the heat-death of the universe. Does it bother me? No. It makes me giggle. I’ve been called a racist and a fascist and a few other more peculiar things. Like I said: I giggle. It’s all so silly. I still write subversive hard SF and program in Pascal. I am what I am. You can’t change me by screaming at me.

Why have I gone on at such length about the disagreement phenomenon? Easy: After years of being a staunchly defended echo chamber, Twitter is now trying to become a profit-making enterprise. I used to pay for CompuServe. If Twitter becomes a paid service, I will pay a (reasonable) price for a subscription. I get the impression (and admit I could be wrong; we’ll see) that Twitter will moderate people who use dirty words to denigrate other people…but won’t ban those posting links to peer-reviewed research showing that Ivermectin is an effective broad-spectrum antiviral.

That would be a tectonic change in the social media universe. It’s going to take a few years for Elon Musk to figure out how to do it. But that dude can orbit 52 telecomm satellites in one damfool rocket…I’m not willing to speculate on what he can’t do.

So. Has Twitter changed since the Great Mastodon Migration? A little. In scrolling down through my Twitter posts over the last month or so, I see a few replies have gone missing, doubtless originally posted by people who are now tooting their little hearts out over on Mastodon. With only a few exceptions, the bluechecks have very little to say that isn’t abject fury at people who disagree with them. (And to think I almost majored in journalism, sheesh.)

Musk is laying off thousands of people. The firm can either survive without them or fold. Me, I’m pretty sure the whole damned operation could be run by a thousand or so good, smart, devoted staffers. The trick is to find and motivate such staffers. I suspect Elon Musk can do it.

In the meantime, the bluechecks are fleeing. G’bye, guys! Have fun over on Mastodon! Here on Twitter we’re still having a wonderful time! (I’d say, “glad you’re not here,” but I’m too nice a guy to do that. What else could you expect from a Pascal programmer?)

Odd Lots

For Validation, Try Federation

Somebody wrote an obnoxious hate-piece over on The Verge some days back, welcoming Elon Musk to Twitter Hell. The essay is for the most part corrosive nonsense, but the piece does have an insight or two. The primary one is true, and subtle to the point where I doubt most people ever give it much thought: What social networks sell is valildation.

In other words, people gather on social networks to feel good about themselves. The network accomplishes this by censoring any voices that disagree with network members. Remember the days when disagreement was a learning opportunity? I do. Even polite disagreement is now “literal violence,” at least to the cohort desperately lacking self-esteem.

What Musk does to Twitter won’t be known for awhile. I’m guessing that people will no longer be banned for politely questioning conventional wisdom, like posting links to evidence that Ivermectin actually does have strong antiviral properties. Ditto HCQ. Why linking to a peer-reviewed scientific paper should be blanket-bombed as “misinformation” is simple: “Misinformation” now means “anything I or my tribe disagree with.” If Musk can call a halt to that, it will have been worth every nickel of his $44B. What it means, however, is that Twitter will become a network that does not specialize in validating its members by silencing their critics. If those seeking validation flee to another network, that’s a good thing. I generate my own validation. So do most of my friends. I guess not everyone can do that.

The real problem with moderation is that it tends to bias network traffic toward viewpoints the moderators favor. Worse, there’s one body of algorithms to moderate the whole damned network. Unless you’re in the favored cohort, you’re out of luck.

There is something called Mastodon that almost nobody talks about. (More on Mastodon here.) It’s a social network composed of independently hosted social networks, joined loosely through a mechanism called federation. Every instance (which is what they call an individual Mastodon server) can have its own moderation guidelines, and everybody can block anybody they don’t want to hear from. This sounds like the perfect solution: On Mastodon, nobody can hear you disagreeing with them if they don’t want to. Shazam! Validation!

I don’t have time to even join a Mastodon instance, much less host my own. If you’ve had experience there, by all means describe it in the comments. I bring it up here today because of an article I read about Twitter founder Jack Dorsey: He’s creating a new social network to rival Twitter. He’s doing it with federation. It’s called Bluesky, and it just opened registration for beta testers. It uses a protocol developed in-house called the Authenticated Transfer Protocol (ATP.)

I’ve been reading the news about Bluesky for the past few days. There’s not much hard information yet, but it sounds a great deal like a slightly more centralized Mastodon. I could be wrong about that. Again, hard data is scarce. I did notice that nowhere in the articles I’ve read is there any significant mention of moderation. That’s a very sore spot for a greeat many people, primarily those who just want validation, or tribalists who want to limit user perspectives to their own template. One hopes that Dorsey can get past this hunger for censoring The Other, and actually create a space where literally all perspectives can be heard.

We’ll see.

Monthwander

SpaceX With Crescent Moon-500 wide.jpg

Last night, when I took the dogs out at about 6:20 PM, I looked toward the crescent moon and immediately saw the unmistakable trace of a rocket about to go by above it. Rockets are fast, so rather than run in and try and find my Canon G16 and risk missing it, I pulled out my phone and did my best. It turned out reasonably well, with even a sort of Halloween-y color cast in deep dusk.

It was a SpaceX launch of still more Starlink satellites, from Vandenberg AFB. Before I could get my phone out to take a shot, we saw the first stage drifting down toward a landing on an unmanned landing barge that Elon Musk has whimsically named Of Course I Still Love You.

Although the shot I took wasn’t bad, there is a site detailing the Vandenberg launch schedule, and next time I’m going to be out there with a tripod and my G16.

_…_ _…_

Elon Musk, yeah. He apparently closed the deal to buy Twitter earlier today, and has already fired top management. One of the first corporate directives he’s going to issue is to un-ban all banned users. He’s also going to throttle way back on content moderation, which for Twitter has generally meant censoring anything Twitter’s management doesn’t like.

That may still take some doing. Ironically, if he succeeds in cleaning house along the lines he’s stated, it could mean that several much smaller social networks catering to those who have been banned or censored by Twitter could lose members to a new “big tent” Twitter. We’ll see how that plays out. Musk knows how to get things done, and if anybody can create a social media network that is open to all sides of the political spectrum, it would be him.

_…_ _…_

All this cooks down to some pretty fundamental questions. What are social networks good for? Twitter seems to be a bottomless well of political derangement, which (as you might imagine) I dodge as best I can. I’m active on Twitter because every time I mention my books there, I sell a few. Whatever else I post there are pretty much what I post here now and then as “odd lots,” i.e., links to interesting things, few or none of them having anything to do with politics.

I’ve stated before that Twitter is an “outrage amplifier,” and it’s still true–but then again, any social network can be an outrage amplifier. Twitter seems particularly good at it, which has always puzzled me. Not long back I began to wonder: Is Twitter what it is because so many journalists are on it? Journalism itself (at least outside of vertical market reporting) seems to draw its energy from outrage. If Musk makes the journalist community run screaming from a network it can no longer dominate, what will Twitter become?

Recent news about Meta’s financial crisis suggests that Twitter could in fact become the new Facebook–especially if the old Facebook becomes insolvent. Zuck seems to be pouring all his energy and free cash flow into a virtual world that nobody asked for and nobody wants. Abandoning his Metaverse would be the ultimate humiliation; one has to wonder if he would pull back before the company crashed for lack of cash.

I have an idea that I think I covered here some time back: a social network server into which many independent social networks could connect and trade information according to rules established by each participating network. If people wanted an echo chamber, they could build an echo chamber. If they wanted a wide-open discussion board, they could build that too.

_…_ _…_

I haven’t posted much over the past month because I’ve been beating hard on the 4th edition of my assembly language book. It’s coming out reasonably well, though I really miss the much-maligned Insight debugger, which I featured in the 3rd edition back in 2009. Most Linux debuggers are designed for C and C++ and don’t have an assembly source code view like Insight had. The source for Insight is available online, and if any of you are capable of creating an installable package, I encourage you to do so. I understand that the damned thing is weird internally, containing as it does the whole damned Tcl/Tk interepreter for the sake of its widget set. Or failing that, if anybody can recommend a standalone (i.e., not SASM) Linux debugger with an assembly view, please let me know. I’ve looked at a lot of them, including Nemiver, edb, and DDD without much success. I’ve thought hard about trying to teach my readers command-line gdb, or even gdb TUI, but naked gdb is a quadruple handful. My book is for absolute beginners, and I’ve got page-count constraints that wouldn’t allow me to teach enough of it to be truly useful.

Insight would be my first choice, but I also described Kdbg in the 2009 edition, and although the source is available and I’ve tried to compile it for modern distros like KDE Plasma and Linux Mint Cinnamon, the make failed for reasons that I don’t understand. Nor do I understand why it was pulled from all the Linux repos to begin with. It was robust and relatively easy to use. Could it be built as an appimage? That would be way cool.

Beyond that I’m certainly open to suggestions.

Review: LOTR The Rings of Power: Stuff That Works and Doesn’t

As with yesterday, there will be spoilers in this entry. Whole great big bleeding buckets full of them. Spoilers never bothered me much, but if they bother you, stop reading now and come back after you’ve seen the whole series.


All jokes aside, I’ll give you the bottom line up front: I liked this series. Quite a bit, in fact, in spite of a little too much pointless dialog and a few howlers. Some things were just wrong, like Galadriel stating that her husband Celeborn had already died in some war. Celeborn was in LOTR, and in fact Galadriel bailed from Middle Earth before Celeborn did, if he bailed at all. Tyler’s The Complete Tolkien Companion (highly recommended) says Celeborn lived into the Fourth Age, and there is no indication that he ever went back to Valinor. I’m sure there were a few other counterfactuals that I just missed. If I missed them, they weren’t serious enough to bother with.

So let me move on to things that I thought worked. First and foremost are the sets and the settings. Egad, I thought Peter Jackson’s films had a lock on this, and in some instances he still does, like the Khazad Dum interiors. Amazon’s Khazad Dum is less grand. All the wide-open spaces are the mines. Living and meeting quarters are smaller, almost comfy. But the cityscapes are breathtaking. So are the sailing ships. And you can’t beat New Zealand for rugged landscapes.

Celebrimbor, the master smith of the Elves, was brilliantly cast in Charles Edwards. He has the face of an Elf Lord to begin with, and he acted like a guy who Makes Important Things. His workshop was a very nice piece of architecture. Also, the process of crafting the Three Rings in that workshop was excellently shown.

Lenny Hendry as Sadoc, the top Harfoot, is terrific. Lloyd Owen is a very good Elendil, both in appearance and in action. Sophia Nomvete as Princess Disa is the only Dwarf woman we spend any significant time with. People are bitching that she didn’t have a beard. Sheesh, guys, not everybody likes beards. And she has a warmth that one doesn’t generally expect from the Dwarves.

And then there’s Adar, a brand-new invention of the showrunners. Adar is one of the Elves captured by Morgoth in the First Age and turned to the dark side. The orcs of the southlands call him “Father,” and that is in fact what the name “Adar” means in Elvish. Adar was born an elf, but bears all the marks of living thousands of years torn between two natures: elf and orc. He wants to protect his orc children from war and sunlight. He hates and claims to have killed Sauron (untrue), though that might have been a lie to keep Galadriel off his case.

The actor playing Adar, Joseph Mawle, presents possibly the most skilled performance in the whole series. Adar is sad, but more than that, he is weary, weary of fending off attempts on his life while he tries to care for his orcs. His craggy, scarred face projects that weariness in every scene where he appears. He takes no pleasure in anything. His defiance is quiet, and sometimes seems desperate. He is eventually captured and imprisoned, though I’m guessing he will have a significant role to play in future episodes.

Reviewers have rolled their eyes at the rock-cracking contest between Prince Durin and Elrond. I think they missed the point: This is a grin-inducing joke on the Dwarves, who consider themselves the masters of iron, stone and mountains. Well, Elrond, who one might think couldn’t even lift the hammer, swings it hard and cracks the rocks with alacrity. When he stops, I almost think he was throwing the contest to Durin as not to embarrass him in front of his underlings in the audience. Given Elrond’s character as shown up to that point, it’s precisely the sort of thing that the good-natured (to the point of goofiness) Elrond would do.

One thing that didn’t work well was the guessing game Amazon was playing with viewers, putting several contenders in front of them and daring them to guess which one was Sauron. I guessed Adar, though in truth none of the choices seemed likely to me. And I was wrong. Adar is Adar, which is a good thing, as I’m eager to see how he will relate to the southlands’ new boss next season. The answer to the puzzle, Halbrand, made me groan. The most I would grant him is a sort of bad-boy girl magnet type who looks a little too much like Viggo Mortensen, who played Aragorn in the Peter Jackson films.

But maybe that was the point. Like his former boss, Sauron is pure evil, but he’s still a king. He didn’t use the power that a major Maia could conceivably summon. Maybe that’s because he was in hiding. And he rescues Galadriel from drowning. That was a lot harder to figure. Once he establishes himself in the brand-new Mordor, I suspect the facade will fall away, and he’ll look like the nastioso that he is and has always been.

Galadriel? She needs to chill a little, or she’s going to pop an artery. The serene power projected from Cate Blanchett in the LOTR films simply isn’t there. Again, I think this is a fault of the scripting. Morfydd Clark didn’t seem as melted into her role as some others in the series, especially Joseph Mawle. Some of her dialog is too too utterly utter. Her acting wasn’t bad. I think the showrunners’ vision of Galadriel was just lightyears away from mine. That’s fair.

The pace is slow. I would have enjoyed a few more action scenes, and maybe a few more minutes to gape at the fantasy world that Amazon’s billion bux created. It is what it is. My recommendation is positive: Watch it. Enjoy the ride. Don’t pick nits; there are nits allthehell over the place, and if you go off on them too hard it’s you who are likely to pop an artery.

Cautiuously recommended.

Review: LOTR The Rings of Power: Silliness

Yesterday was all overview. Today we get into things that most people would consider spoilers. So if you’re of the cohort that can’t abide spoilers, leave now.


Here and there during the 9+ hours of the first season of The Rings of Power, I rolled my eyes. Every so often, I giggled. I doubt that this is what Amazon intended. I’m a hard man to please on the fiction side. I considered The Silmarillion a waste of time and money. I’d already been to college, and had read quite enough Cliff Notes, thank you very much. I wanted another story.

The Rings of Power is certainly a story. Several stories, in fact, and I enjoyed most of them. I was very interested to see what Amazon could do, given how little they had to work with about the Second Age. We got Ar-Pharazon the Golden; will we get the sinking of Atalante? (Yes. That’s what Tolkien called the Lost Continent underneath Numenor. Really.) Well, they made a lot of it up. What would you do, with a sparse outline of events and a billion bux to blow? You’d make most of it up too.

They did. Some of what they made up was better than expected. And some…I giggled.

First up: The Three Witches Or Something Very Like Them. Here and there in the saga there were these three women dressed in spotless cream-white capes, wandering around the wild country asking every third person they met if they were Sauron. This is silly enough on the surface. But really: Where were the grass stains? Where were their backpacks? Did they camp somewhere, somehow, or just get a room at the Southlands Best Western?

One was a soldier, with a helmet. She threw knives, and nailed one of my favorite characters. Another was a preacher, with her hair under cover, who carried a saucer sled and said a lot of pompous things that didn’t amount to much. But the third…Eru help us…she was another damn deranged albino. I was already tired of deranged albinos in 2008. (There is a whole Wikipedia entry about deranged albinos.) I guessed that she was the boss, carrying around a very Egyptian-looking magical staff and levitating rocks with it. Alas, she eventually picked a fight with the wrong man (also not Sauron) who grabbed her staff and roasted the three of them real good.

The Harfoots (proto-hobbits) were sweet and sane, and only occasionally silly. I liked Sadoc the Harfoot tribal chieftan, who was well-cast and acted the part brilliantly. He defied The Three Witches Or Something Very Like Them and got a knife in the heart for his trouble. So what was silly? Just this: As best I could tell, their primary source of protein was…snails. Raw. Sometimes shells and all. Ye valar, everybody knows that snails carry a veritable arsenal of parasites, many of which can send you off to that far green country beneath a swift sunrise with barely a burp. The Harfoots haul their whole village around in tumbrel carts. A few dozen chickens in cages wouldn’t weigh that much and could work wonders for their diets.

Ok. Here we get to the more significant stuff. Elrond, one of the Elf-lords who eventually got to wear one of the Three Elf Rings of Power, is a cuddly, huggy, back-slapping round-faced good ‘ol boy who looked like he could do standup and keep the audience in stitches. Ok, this was the Second Age. He still had a few thousand years to develop Hugo Weaving’s gravitas–but probably wouldn’t. The actor did his best with what they gave him. But the casting and the scripting were all wrong.

And now, the biggie: Early in the series, a human teen kid named Theo discovers a weird artifact in his unpleasant neighbor’s barn. It looks like the hilt of a sword minus the blade. It gives him the serious galloping creeps, so being a teen, the only thing he could think of doing is to wrap it up in rags and take it home. It comes out of hiding here and there, with Theo’s blacksmith friend finding that hammers can’t do a thing to it. Shifty-eyed people want it, and eventually get it, without having to kill Theo in the process, whew. I was thinking it was some kind of immaterial magic sword, which would have been way cool, like an Iron Age lightsaber. But no–here there be belly-laugh spoilers–the damned thing is the ignition key for Mount Doom.

Really. And literally. I am not making this up. The shifty-eyed neighbor takes the gizmo, shoves it down into some kind of keyhole, and gives it a twist, just like a car key, if any of you remember what car keys were. Alluva sudden, in an undisclosed location that clearly wasn’t anywhere nearby, hidden machinery opened up a very big dam and sent a megacrapgallon torrent of water roaring toward the dormant volcano. The water goes down into the cracks, meets some lava, and (presumably) boils. Then, boom! Old Orodruin (AKA Mount Doom) suddenly erupts like Krakatoa cubed, and turns the Southlands into…wait for it…naw, you already figured it out…Mordor.

I did not know that you could make a dormant volcano erupt (rather than merely explode) by giving it a good thorough soaking. I was really into volcanoes when I was a kid, and that never came up in any of the books I read about them.

I didn’t giggle. I laughed out loud.

Here and there I also groaned, but those groans were few and far between. (I hope you figured out by now that I’m not being entirely serious about all this.)

To avoid leaving you with the wrong impression, tomorrow let’s talk instead about what works and how well.

Review: LOTR The Rings of Power: Overview

Carol was gone for a week, so after I burned out on updating my assembly language book during the days, I had empty evenings. My path was obvious: Pour myself a drink or two, and binge on the first season (now complete) of Amazon’s Tolkien pastiche, The Rings of Power. I’ve seen various estimates of how much money Amazon is spending on the project, which is projected to release eight episodes a year for five years. Whether it’s 750 million or a billion, that is very serious money.

As best I can tell, Amazon bought rights to The Lord of the Rings…appendices. They pointedly did not license The Silmarillion, which I’ve heard was a rule laid down by the great man himself and respected by his estate. My guess? He really didn’t want The Silmarillion turned into a story.

The Silmarillion is not a story. In a way, it’s the Cliff Notes to a bunch of stories that JRR never wrote. But in truth, it’s a history. It’s like viewing a story on satellite video from Middle Earth orbit: We get to see all the people and the monsters running around killing each other, a continent and a half sunk to the ocean bottom, and much else. But we get inside no one’s head to experience their insights or their sufferings. It’s all Who Did What To Whom (Or What) But Not Why, which set the stage for the extremely rich cultural background behind The Lord of the Rings saga itself. (I consider The Hobbit part of that saga.)

We have Amazon Prime. The series is part of Prime, and thus without marginal cost. Why not? I’d already paid my money. I took my choice.

So what did I get? Here’s quick list:

  • Some of the most beautiful scenery and backdrops I’ve ever seen in cinema, greater than what Peter Jackson managed twenty-odd years ago, and his weren’t shabby.
  • A great deal of interpolation and (mostly) studied invention of a lot of original characters and conflicts. Some of this was very good; I much enjoyed the Harfoots (basically wandering Iron Age proto-hobbits), particularly Nori and Poppy.
  • A certain amount (probably less than you might have read elsewhere) of silliness, none of which we can lay directly at the feet of JRR. I’ll come back to this.
  • Mostly excellent acting, and (huzzah!) no celebrities.
  • A slow, often clumsy, dialog-heavy screenplay, which at times bore more than a whiff of an Iron Age Days of Our Lives. When you have 560 minutes to fill, well, dialog is cheap. Alas, as dialog goes, it wasn’t thin gruel, but gruel so thick it was occasionally impossible to swallow.
  • Wholesale butchery of the Tolkien timeline. This may have been necessary, given the scraps Amazon was able to license versus what true Tolkien fans were sure to expect. The Dwarves didn’t strike balrog until Third Age 1980, but Durin the Somethingeth almost got the booby prize thousands of years earlier, in the Second Age. Everybody loves balrogs, right? They break the Days of Our Lives boredom, fersure. I’m guessing we’ll be seeing more balroggery in forthcoming seasons, if Amazon doesn’t run out of money first.
  • A puzzle: Which character is actually Sauron? I guessed wrong, but as with a lot else, I’ll come back to that.

This will have to do for today. I have to leave for the airport pretty soon to pick up Carol.