diff --git a/core/org.eclipse.cdt.core/.settings/.api_filters b/core/org.eclipse.cdt.core/.settings/.api_filters new file mode 100644 index 00000000000..9dabfaff023 --- /dev/null +++ b/core/org.eclipse.cdt.core/.settings/.api_filters @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF index 9492fc2e2b4..5c121e5c37f 100644 --- a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true -Bundle-Version: 8.3.200.qualifier +Bundle-Version: 8.4.0.qualifier Bundle-Activator: org.eclipse.cdt.core.CCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff64.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff64.java index 3cd29d76e47..412f8d52aae 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff64.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff64.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2020 Space Codesign Systems and others. + * Copyright (c) 2000, 2023 Space Codesign Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -12,6 +12,7 @@ * Space Codesign Systems - Initial API and implementation * QNX Software Systems - Initial Coff class * Alexander Fedorov (ArSysOp) - Bug 561992 + * John Dallaway - Provide additional section header flags (#652) *******************************************************************************/ package org.eclipse.cdt.utils.coff; @@ -310,6 +311,10 @@ public class Coff64 { word boundary. */ public final static int STYP_LIT = 0x8020; /* Literal data (like STYP_TEXT) */ + /** @since 8.4 */ + public static final int STYP_MEM_DISCARDABLE = 0x02000000; /* section is discardable */ + /** @since 8.4 */ + public static final int STYP_MEM_WRITE = 0x80000000; /* section can be written to */ public byte[] s_name = new byte[8]; // 8 bytes: section name public int s_paddr; // 4 bytes: physical address, aliased s_nlib diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/PEHelper64.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/PEHelper64.java new file mode 100644 index 00000000000..0ecbc3a3228 --- /dev/null +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/PEHelper64.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2000, 2023 QNX Software Systems and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * QNX Software Systems - Initial API and implementation of ElfHelper + * John Dallaway - Initial PEHelper64 implementation (#652) + *******************************************************************************/ +package org.eclipse.cdt.utils.coff; + +import java.io.IOException; + +import org.eclipse.cdt.utils.coff.Coff64.FileHeader; +import org.eclipse.cdt.utils.coff.Coff64.SectionHeader; + +/** + * PEHelper64 is a wrapper class for the PE64 class + * to provide higher level API for sorting/searching the COFF data. + * + * @see PE64 + * @since 8.4 + */ +public final class PEHelper64 { + + public static record Sizes(long text, long data, long bss) { + + public long total() { + return text + data + bss; + } + + } + + private final PE64 pe64; + + public PEHelper64(PE64 pe64) { + this.pe64 = pe64; + } + + public Sizes getSizes() throws IOException { + long bss = 0; + long data = 0; + long text = 0; + + boolean isExecutable = (pe64.getFileHeader().f_flags & FileHeader.F_EXEC) != 0; + for (SectionHeader section : pe64.getSectionHeaders()) { + if ((section.s_flags & SectionHeader.STYP_MEM_DISCARDABLE) != 0) { + continue; // ignore discardable section + } + long size = isExecutable ? section.s_paddr : section.s_size; + if ((section.s_flags & SectionHeader.STYP_BSS) != 0) { + bss += size; + } else if ((section.s_flags & SectionHeader.STYP_DATA) != 0) { + if ((section.s_flags & SectionHeader.STYP_MEM_WRITE) != 0) { + data += size; // treat writable data section as data + } else { + text += size; // treat non-writable data section as text + } + } else if ((section.s_flags & SectionHeader.STYP_TEXT) != 0) { + text += size; + } + } + return new Sizes(text, data, bss); + } + +} diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject64.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject64.java index 56b3e3ca6f5..573c74d30d4 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject64.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/parser/PEBinaryObject64.java @@ -12,6 +12,7 @@ * Space Codesign Systems - Initial API and implementation * QNX Software Systems - Initial PEBinaryObject class * John Dallaway - Fix archive header processing (#630) + * John Dallaway - Support sections sizes in binary info (#652) *******************************************************************************/ package org.eclipse.cdt.utils.coff.parser; @@ -34,6 +35,8 @@ import org.eclipse.cdt.utils.BinaryObjectAdapter; import org.eclipse.cdt.utils.Symbol; import org.eclipse.cdt.utils.coff.Coff64; import org.eclipse.cdt.utils.coff.PE64; +import org.eclipse.cdt.utils.coff.PEHelper64; +import org.eclipse.cdt.utils.coff.PEHelper64.Sizes; import org.eclipse.core.runtime.IPath; /** @@ -146,6 +149,10 @@ public class PEBinaryObject64 extends BinaryObjectAdapter { info.isLittleEndian = attribute.isLittleEndian(); info.hasDebug = attribute.hasDebug(); info.cpu = attribute.getCPU(); + Sizes sizes = new PEHelper64(pe).getSizes(); + info.bss = sizes.bss(); + info.data = sizes.data(); + info.text = sizes.text(); } protected void loadSymbols(PE64 pe) throws IOException {