blob: beffd0ec1bb979c503513c8ac62694c9b3b814be [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 EfficiOS Inc., Alexandre Montplaisir
*
* All rights reserved. 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
*******************************************************************************/
package org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo;
import java.util.Objects;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.eclipse.jdt.annotation.Nullable;
/**
* Wrapper class to reference to a particular binary, which can be an
* executable or library. It contains both the complete file path (at the
* time the trace was taken) and the build ID of the binary.
*
* @author Alexandre Montplaisir
* @noreference Meant to be used internally by the analysis only
*/
public class UstDebugInfoBinaryFile implements Comparable<UstDebugInfoBinaryFile> {
private final String fFilePath;
private final @Nullable String fBuildId;
private final @Nullable String fDebugLink;
private final boolean fIsPic;
/**
* Constructor
*
* @param filePath
* The binary's path on the filesystem.
* @param buildId
* The binary's unique buildID (in base16 form).
* @param debugLink
* Path to the binary's separate debug info.
* @param isPic
* Whether the code in the binary is position-independent.
*/
public UstDebugInfoBinaryFile(String filePath, @Nullable String buildId,
@Nullable String debugLink, boolean isPic) {
fFilePath = filePath;
fBuildId = buildId;
fDebugLink = debugLink;
fIsPic = isPic;
}
/**
* Get the file's path, as was referenced to in the trace.
*
* @return The file path
*/
public String getFilePath() {
return fFilePath;
}
/**
* Get the build ID of the binary. It should be a unique identifier.
*
* On Unix systems, you can use <pre>eu-readelf -n [binary]</pre> to get
* this ID.
*
* @return The file's build ID, or null if the file has no build ID..
*/
public @Nullable String getBuildId() {
return fBuildId;
}
/**
* Get the path to the separate debug info of this binary.
*
* @return The path to the separate debug info, or null if the file has no
* separate debug info.
*/
public @Nullable String getDebugLink() {
return fDebugLink;
}
/**
* Return whether the given file (binary or library) is Position-Independent
* Code or not.
*
* This indicates whether the symbols in the ELF are absolute or relative to
* the runtime base address, and determines which address we need to pass to
* 'addr2line'.
*
* @return Whether this file is position-independent or not
*/
public boolean isPic() {
return fIsPic;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("path", fFilePath) //$NON-NLS-1$
.append("build_id", fBuildId) //$NON-NLS-1$
.append("debug_link", fDebugLink) //$NON-NLS-1$
.append("is_pic", fIsPic) //$NON-NLS-1$
.toString();
}
@Override
public int hashCode() {
return Objects.hash(fFilePath, fBuildId, fDebugLink, fIsPic);
}
@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(getClass().equals(obj.getClass()))) {
return false;
}
UstDebugInfoBinaryFile other = (UstDebugInfoBinaryFile) obj;
return Objects.equals(fFilePath, other.fFilePath) &&
Objects.equals(fBuildId, other.fBuildId) &&
Objects.equals(fDebugLink, other.fDebugLink) &&
fIsPic == other.fIsPic;
}
/**
* Used for sorting. Sorts by using alphabetical order of the file
* paths.
*/
@Override
public int compareTo(@Nullable UstDebugInfoBinaryFile o) {
if (o == null) {
return 1;
}
return fFilePath.compareTo(o.fFilePath);
}
}