lib/ronin/payloads/c_payload.rb in ronin-payloads-0.1.6 vs lib/ronin/payloads/c_payload.rb in ronin-payloads-0.2.0.rc1
- old
+ new
@@ -1,11 +1,11 @@
# frozen_string_literal: true
#
# ronin-payloads - A Ruby micro-framework for writing and running exploit
# payloads.
#
-# Copyright (c) 2007-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
+# Copyright (c) 2007-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
#
# ronin-payloads is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
@@ -18,18 +18,21 @@
# You should have received a copy of the GNU Lesser General Public License
# along with ronin-payloads. If not, see <https://www.gnu.org/licenses/>.
#
require 'ronin/payloads/binary_payload'
+require 'ronin/payloads/mixins/c_compiler'
module Ronin
module Payloads
#
# A {Payload} class that represents all C payloads.
#
class CPayload < BinaryPayload
+ include Mixins::CCompiler
+
#
# Returns the type or kind of payload.
#
# @return [Symbol]
#
@@ -38,68 +41,9 @@
#
# @api private
#
def self.payload_type
:c
- end
-
- #
- # The default C compiler.
- #
- # @return [String]
- #
- def self.cc
- ENV['CC'] || 'cc'
- end
-
- param :cc, required: true,
- default: -> { cc },
- desc: 'The C compiler to use'
-
- #
- # Compiles one or more source files using `cc`.
- #
- # @param [Array<String>] source_files
- # The source file(s) to compile.
- #
- # @param [String] output
- # The output file path.
- #
- # @param [Array<String>, Hash{Symbol,String => String}, nil] defs
- # Additional macro definitions to pass to the compiler.
- #
- # @raise [ArgumentError]
- # `defs` was not an Array or a Hash.
- #
- # @raise [BuildFailed]
- # The `cc` command failed or is not installed.
- #
- def compile(*source_files, output: , defs: nil)
- args = [params[:cc], '-o', output]
-
- if defs
- case defs
- when Array
- defs.each do |value|
- args << "-D#{value}"
- end
- when Hash
- defs.each do |name,value|
- args << "-D#{name}=#{value}"
- end
- else
- raise(ArgumentError,"defs must be either an Array or a Hash: #{defs.inspect}")
- end
- end
-
- args.concat(source_files)
-
- case system(*args)
- when false
- raise(BuildFailed,"cc command failed: #{args.join(' ')}")
- when nil
- raise(BuildFailed,"cc command not installed")
- end
end
end
end
end