| /******************************************************************************* |
| * Copyright (c) 2000, 2015 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 |
| *******************************************************************************/ |
| package org.eclipse.cdt.utils; |
| |
| import java.util.Arrays; |
| |
| import org.eclipse.cdt.core.IAddress; |
| import org.eclipse.cdt.core.IAddressFactory; |
| import org.eclipse.cdt.core.IBinaryParser; |
| import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; |
| import org.eclipse.cdt.core.IBinaryParser.ISymbol; |
| import org.eclipse.core.runtime.IPath; |
| |
| /** |
| */ |
| public abstract class BinaryObjectAdapter extends BinaryFile implements IBinaryObject { |
| |
| protected static final ISymbol[] NO_SYMBOLS = new ISymbol[0]; |
| |
| public class BinaryObjectInfo { |
| public long bss; |
| public long data; |
| public long text; |
| public boolean hasDebug; |
| public boolean isLittleEndian; |
| public String soname; |
| public String[] needed; |
| public String cpu; |
| |
| public BinaryObjectInfo() { |
| cpu = soname = ""; //$NON-NLS-1$ |
| needed = new String[0]; |
| } |
| } |
| |
| public BinaryObjectAdapter(IBinaryParser parser, IPath path, int type) { |
| super(parser, path, type); |
| } |
| |
| @Override |
| public ISymbol getSymbol(IAddress addr) { |
| ISymbol[] syms = getSymbols(); |
| int insertion = Arrays.binarySearch(syms, addr); |
| if (insertion >= 0) { |
| return syms[insertion]; |
| } |
| if (insertion == -1) { |
| return null; |
| } |
| insertion = -insertion - 1; |
| ISymbol symbol = syms[insertion - 1]; |
| if (addr.compareTo(symbol.getAddress().add(symbol.getSize())) < 0) { |
| return syms[insertion - 1]; |
| } |
| return null; |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getBSS() |
| */ |
| @Override |
| public long getBSS() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.bss; |
| } |
| return 0; |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getCPU() |
| */ |
| @Override |
| public String getCPU() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.cpu; |
| } |
| return ""; //$NON-NLS-1$ |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getData() |
| */ |
| @Override |
| public long getData() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.data; |
| } |
| return 0; |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getText() |
| */ |
| @Override |
| public long getText() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.text; |
| } |
| return 0; |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#hasDebug() |
| */ |
| @Override |
| public boolean hasDebug() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.hasDebug; |
| } |
| return false; |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#isLittleEndian() |
| */ |
| @Override |
| public boolean isLittleEndian() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.isLittleEndian; |
| } |
| return false; |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryExecutable#getNeededSharedLibs() |
| */ |
| public String[] getNeededSharedLibs() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.needed; |
| } |
| return new String[0]; |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryShared#getSoName() |
| */ |
| public String getSoName() { |
| BinaryObjectInfo info = getBinaryObjectInfo(); |
| if (info != null) { |
| return info.soname; |
| } |
| return ""; //$NON-NLS-1$ |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getName() |
| */ |
| @Override |
| public String getName() { |
| return getPath().lastSegment().toString(); |
| } |
| |
| @Override |
| public String toString() { |
| return getName(); |
| } |
| |
| /** |
| * @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getSymbols() |
| */ |
| @Override |
| public abstract ISymbol[] getSymbols(); |
| |
| @Override |
| public abstract IAddressFactory getAddressFactory(); |
| |
| protected abstract BinaryObjectInfo getBinaryObjectInfo(); |
| |
| } |