1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 14:15:23 +02:00

Extend Mach-O load command support

We skip load commands that are not processed by the symbol loader and
log commands that are not recognized.
This commit is contained in:
John Dallaway 2025-06-15 15:29:20 +01:00
parent e2e1d207c3
commit f591672014
3 changed files with 116 additions and 4 deletions

View file

@ -26,4 +26,68 @@
</message_arguments>
</filter>
</resource>
<resource path="utils/org/eclipse/cdt/utils/macho/MachO64.java" type="org.eclipse.cdt.utils.macho.MachO64$LoadCommand">
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_BUILD_VERSION"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_CODE_SIGNATURE"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_DATA_IN_CODE"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_DYLD_CHAINED_FIXUPS"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_DYLD_EXPORTS_TRIE"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_FUNCTION_STARTS"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_MAIN"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.LoadCommand"/>
<message_argument value="LC_SOURCE_VERSION"/>
</message_arguments>
</filter>
</resource>
<resource path="utils/org/eclipse/cdt/utils/macho/MachO64.java" type="org.eclipse.cdt.utils.macho.MachO64$MachOhdr">
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.MachOhdr"/>
<message_argument value="CPU_TYPE_ARM"/>
</message_arguments>
</filter>
<filter id="336658481">
<message_arguments>
<message_argument value="org.eclipse.cdt.utils.macho.MachO64.MachOhdr"/>
<message_argument value="CPU_TYPE_ARM64"/>
</message_arguments>
</filter>
</resource>
</component>

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true
Bundle-Version: 9.1.100.qualifier
Bundle-Version: 9.2.0.qualifier
Bundle-Activator: org.eclipse.cdt.core.CCorePlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2024 QNX Software Systems and others.
* Copyright (c) 2000, 2025 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@ -13,6 +13,7 @@
* Craig Watson.
* Apple Computer - work on performance optimizations
* Alexander Fedorov (ArSysOp) - fix resource leak (#693)
* John Dallaway - extend load command support (#1204)
*******************************************************************************/
package org.eclipse.cdt.utils.macho;
@ -29,6 +30,7 @@ import org.eclipse.cdt.core.ISymbolReader;
import org.eclipse.cdt.utils.CPPFilt;
import org.eclipse.cdt.utils.debug.stabs.StabConstant;
import org.eclipse.cdt.utils.debug.stabs.StabsReader;
import org.eclipse.core.runtime.ILog;
/**
* @since 5.2
@ -75,6 +77,10 @@ public class MachO64 implements AutoCloseable {
public final static int CPU_TYPE_X86_64 = (CPU_TYPE_X86 | CPU_ARCH_ABI64);
public final static int CPU_TYPE_MC98000 = 10;
public final static int CPU_TYPE_HPPA = 11;
/** @since 9.2 */
public final static int CPU_TYPE_ARM = 12;
/** @since 9.2 */
public final static int CPU_TYPE_ARM64 = (CPU_TYPE_ARM | CPU_ARCH_ABI64);
public final static int CPU_TYPE_MC88000 = 13;
public final static int CPU_TYPE_SPARC = 14;
public final static int CPU_TYPE_I860 = 15;
@ -362,11 +368,27 @@ public class MachO64 implements AutoCloseable {
public final static int LC_SEGMENT_64 = 0x19;
public final static int LC_ROUTINES_64 = 0x1a;
public final static int LC_UUID = 0x1b;
/** @since 9.2 */
public final static int LC_CODE_SIGNATURE = 0x1d;
/** @since 9.2 */
public final static int LC_FUNCTION_STARTS = 0x26;
/** @since 9.2 */
public final static int LC_DATA_IN_CODE = 0x29;
/** @since 9.2 */
public final static int LC_SOURCE_VERSION = 0x2a;
/** @since 9.2 */
public final static int LC_BUILD_VERSION = 0x32;
/*
* load a dynamically linked shared library that is allowed to be missing
* (all symbols are weak imported).
*/
public final static int LC_LOAD_WEAK_DYLIB = (0x18 | LC_REQ_DYLD);
/** @since 9.2 */
public final static int LC_MAIN = (0x28 | LC_REQ_DYLD);
/** @since 9.2 */
public final static int LC_DYLD_EXPORTS_TRIE = (0x33 | LC_REQ_DYLD);
/** @since 9.2 */
public final static int LC_DYLD_CHAINED_FIXUPS = (0x34 | LC_REQ_DYLD);
public int cmd;
public int cmdsize;
@ -1104,6 +1126,12 @@ public class MachO64 implements AutoCloseable {
}
switch (mhdr.cputype) {
case MachO64.MachOhdr.CPU_TYPE_ARM:
attrib.cpu = "arm"; //$NON-NLS-1$
break;
case MachO64.MachOhdr.CPU_TYPE_ARM64:
attrib.cpu = "aarch64"; //$NON-NLS-1$
break;
case MachO64.MachOhdr.CPU_TYPE_X86_64:
attrib.cpu = "x86_64"; //$NON-NLS-1$
break;
@ -1458,6 +1486,7 @@ public class MachO64 implements AutoCloseable {
loadcommands[i] = sscmd;
break;
case LoadCommand.LC_MAIN:
case LoadCommand.LC_THREAD:
case LoadCommand.LC_UNIXTHREAD:
ThreadCommand thcmd = new ThreadCommand();
@ -1660,6 +1689,7 @@ public class MachO64 implements AutoCloseable {
tlhcmd.nhints = efile.readIntE();
loadcommands[i] = tlhcmd;
break;
case LoadCommand.LC_UUID:
MachUUID uuidCmd = new MachUUID();
uuidCmd.cmd = cmd;
@ -1669,6 +1699,7 @@ public class MachO64 implements AutoCloseable {
uuidCmd.uuid = new String(uuid, 0, 16);
loadcommands[i] = uuidCmd;
break;
case LoadCommand.LC_PREBIND_CKSUM:
PrebindCksumCommand pbccmd = new PrebindCksumCommand();
pbccmd.cmd = cmd;
@ -1677,12 +1708,29 @@ public class MachO64 implements AutoCloseable {
loadcommands[i] = pbccmd;
break;
case LoadCommand.LC_BUILD_VERSION:
case LoadCommand.LC_CODE_SIGNATURE:
case LoadCommand.LC_DATA_IN_CODE:
case LoadCommand.LC_DYLD_CHAINED_FIXUPS:
case LoadCommand.LC_DYLD_EXPORTS_TRIE:
case LoadCommand.LC_FUNCTION_STARTS:
case LoadCommand.LC_SOURCE_VERSION:
// known load commands we ignore
LoadCommand misccmd = new LoadCommand();
misccmd.cmd = cmd;
misccmd.cmdsize = len;
loadcommands[i] = misccmd;
efile.skipBytes(len - 8);
break;
default:
// fallback, just in case we don't recognize the command
// unknown load command
UnknownCommand unknowncmd = new UnknownCommand();
unknowncmd.cmd = cmd;
unknowncmd.cmdsize = 0;
unknowncmd.cmdsize = len;
loadcommands[i] = unknowncmd;
efile.skipBytes(len - 8);
ILog.get().warn(String.format("Mach-O load command 0x%x not handled", cmd)); //$NON-NLS-1$
break;
}
}